- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果这个问题不属于这里,我深表歉意,我的问题不在于代码,而在于算法,所以也许它更适合另一个网站,但 stackoverflow 的好人永远不会让我失望。
这里是问题:
给定 2 个排序数组 A
和 B
,它们具有相同数量的元素,假设 n
,并且它们确实如此不共享元素,并且没有元素在同一个数组中出现两次,求对数时间复杂度的数组并集的中位数。
非常重要的提示:如果n
是奇数,那么中位数就是中间的元素。但如果 n
是偶数,则中位数不是中间元素的平均值。它被定义为中间元素的最小值。
解决方案:思路很简单。由于它们已排序,我们可以找到 A
的中位数(称为 med1
)和 B
的中位数(称为 med2
) 在 O(1)
中。如果 med1>med2
那么我们知道并集的中位数是 A
的一个元素,它小于 med1
或者 的一个元素>B
大于med2
,如果med2>med1
则相反。所以我们扔掉多余的元素并做同样的过程,直到 A
和 B
足够小,比如每个有 2 个元素,然后我们只需要找到中位数在这4个数字之间。 4 个数字的中位数将是第二个最小值,因为 4 是偶数,这将是 O(1)
。
这是我的代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int *scan_array(int* array_length);
int second_min_four_numbers(int a,int b,int c,int d);
int first_question(int *arr1,int *arr2,int left1,int right1,int left2,int right2);
void main()
{
int *arr1,*arr2,length_arr1=0,length_arr2=0;
printf("For the first sorted array:\n");
arr1=scan_array(&length_arr1);
printf("\nFor the second sorted array, enter %d numbers:\n",length_arr1);
arr2=scan_array(&length_arr2);
if(length_arr1==1) //edge case, arrays are length one. return the min
{
if(arr1[0] > arr2[0])
printf("The Median is %d",arr2[0]);
else
printf("The Median is %d",arr1[0]);
}
else
printf("The Median is %d",first_question(arr1,arr2,0,length_arr1-1,0,length_arr2-1));
getch();
}
int *scan_array(int* array_length) //nothing fancy. just scan the arrays.
{
int* temp,temp_length,array_element,i=0,*real_array;
temp=(int*)malloc(50*sizeof(int));
printf("Enter positive numbers. To stop enter negative or zero.\nDon't enter more than 50 numbers\n");
scanf("%d",&array_element);
while(array_element>0)
{
(*array_length)++;
temp[i]=array_element;
i++;
scanf("%d",&array_element);
}
real_array=(int*)malloc((*array_length)*sizeof(int));
for(i=0;i<*array_length;i++)
real_array[i]=temp[i];
free(temp);
return real_array;
}
int first_question(int *arr1,int *arr2,int left1,int right1,int left2,int right2)
{
int med1,med2;
if(right1-left1+right2-left2 == 2) //we are done. reached 4 elements. we will always be here for arrays larger than 1 element each
return second_min_four_numbers(arr1[left1],arr1[right1],arr2[left2],arr2[right2]);
med1=arr1[(left1+right1)/2]; //not done. find the medians in O(1).
med2=arr2[(left2+right2)/2];
if(med1 < med2)//the median of the union is somewhere between them
return first_question(arr1,arr2,(left1+right1)/2,right1,left2,(left2+right2)/2);
else
return first_question(arr1,arr2,left1,(left1+right1)/2,(left2+right2)/2,right2);
}
int second_min_four_numbers(int a,int b,int c,int d) //find second min between four numbers
{
int min=0,second_min=0; //very crude, and inefficient but simple to understand and still O(1)
min = a;
if(min > b)
min = b;
if(min > c)
min = c;
if(min > d)
min = d;
if(a == min)
{
second_min=b;
if(second_min > c)
second_min = c;
if(second_min > d)
second_min = d;
return second_min;
}
if(b == min)
{
second_min=a;
if(second_min > c)
second_min=c;
if(second_min > d)
second_min = d;
return second_min;
}
if(c == min)
{
second_min=a;
if(second_min > b)
second_min = b;
if(second_min > d)
second_min = d;
return second_min;
}
if(d == min)
{
second_min=a;
if(second_min > b)
second_min=b;
if(second_min > c)
second_min=c;
return second_min;
}
}
它按预期工作并编译。正如我所说,问题不在于我的代码,而在于算法。让我们看一个演示问题的示例:
假设我们的输入是 A=[1,3,5]
和 B=[2,4,6]
。然后是 med1=3
和 med2=4
。丢弃冗余元素,现在我们有 A=[3,5]
和 B=[2,4]
。现在我们总共只有 4 个元素,数据足够小,所以只需找到这 4 个数字的中位数 [3,5,2,4]
。中位数将是 3
,这也是 A
和 B
并集的中位数的正确结果,因此结果是正确的。
现在假设我们的输入是 A=[1,3,5,7]
和 B=[2,4,6,8]
。 med1=3
和 med2=4
。扔掉多余的元素得到A=[3,5,7]
和B=[2,4]
。现在 med1=5
和 med2=2
。再次丢弃冗余以获得 A=[3,5]
和 B=[2,4]
。现在我们的数据足够小,找到 [3,5,2,4]
的中位数,这将再次给我们 3
。但那个结果是不正确的。 3
不是 A
和 B
并集的中位数。正确的结果是 4
。
我们如何解决这个问题?
最佳答案
算法需要对中位数进行二分查找,即提出一个可能的中位数值。如果该值太低,则在下一次迭代中选择更高的值。如果太高,则选择较低的值。
在每次迭代中,我们从 A 中选择一个候选者,并从 B 中选择一个候选者。较小的候选者被提议作为中值,并进行评估。如果建议的中位数太小,则可以从考虑中删除 A 和 B 中所有较小的值。同样,如果建议的中位数太大,则可以忽略 A 和 B 中较大的值。
例如,给定A=[1,2,7,19,22]
来自 A 的候选人将是 7。假设 B 提出了更大的候选人,因此选择 7 作为可能的中位数。如果 7 太低,那么我们可以消除所有元素 <= 7
在 A 和 B 中都是可能的候选人。所以 A 变成 A=[1,2,7,{19,22}]
其中大括号中的元素是中位数的剩余可能候选者。重复该过程,但这次来自 A 的候选人将是 19 岁。
继续这个例子,假设B=[20,25,26,27]
. B 建议的候选人是 25。A 的候选人较低,因此我们评估 19。列表 A 有 3 个值低于 19,有 1 个值高于 19。列表 B 的值高 4 个。总共 3 个低,5 个高。结论:19 太低,所以尽可能排除所有数字 <= 19 的候选人。两次通过后我们有
A=[1,2,7,19,{22}] B=[{20,25,26,27}]
A 的候选人是 22,B 的候选人是 25,建议 22 作为中位数。 22 太高了,所以数字 >= 22 可以忽略,我们有
A=[1,2,7,19,{},22] // 19 was too low and 22 was too high, so no candidates are left in A
B=[{20},25,26,27] // 22 was too high, so the only remaining candidate in B is 20
20 是两个列表中唯一剩下的候选者,因此是答案。
关于c - 排序数组 union 的中位数 - 递归结束后做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29707607/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!