Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 两个排序数组中的选择_Arrays_Algorithm_Sorting_Search - Fatal编程技术网

Arrays 两个排序数组中的选择

Arrays 两个排序数组中的选择,arrays,algorithm,sorting,search,Arrays,Algorithm,Sorting,Search,给定两个排序数组a[]和b[],大小不一N1和N2分别设计了一个算法来查找第k个最大密钥。算法最坏情况下运行时间的增长顺序应为 lg(N1+N2) 这个问题的提示表明有两种可能的解决方案: 方法A:计算中位值a[] 中位数是多少 b[]. 在大约一半大小的子问题中重复出现 我已经实现了这个解决方案(其实质是将a[]和b[]的大小调整/截断为长度k,在每个长度中找到中值,比较它们,并选择适当的数组的一半-根据需要处理角点情况。) 另一种方法是: 设计一个常数时间算法来确定a[

给定两个排序数组a[]和b[],大小不一N1和N2分别设计了一个算法来查找第k个最大密钥。算法最坏情况下运行时间的增长顺序应为 lg(N1+N2)

这个问题的提示表明有两种可能的解决方案:

方法A:计算中位值a[] 中位数是多少 b[]. 在大约一半大小的子问题中重复出现

我已经实现了这个解决方案(其实质是将a[]和b[]的大小调整/截断为长度k,在每个长度中找到中值,比较它们,并选择适当的数组的一半-根据需要处理角点情况。)

另一种方法是:

设计一个常数时间算法来确定a[i] 是kth吗 最大的钥匙。使用此子例程和二进制搜索

我很难找到如何进行这种方法。我知道,只要给定一个数组,就可以通过简单地查找该元素的索引来确定给定元素是否是O(1)时间内第k个最大键。但是,我不确定两个数组何时可以确定一个元素是否是这两个数组的并集中的第k个最大元素。

如果
x
a&union;b
,则在
a&Union中正好有
k-1
较大的元素;b
。假设数组是按降序排序的——如果以另一种方式排序,则必须调整算术运算——那么
a
中正好有
i-1
元素大于
a[i]
;联合体中剩余的较大元素必须来自
b


因此,
a[i]
a⋃b
如果
b
中确实存在
k-i
较大的元素,因为在这种情况下,联合体中将存在
i-1+k-i==k-1
较大的元素。因此,你需要将
a[i]
b[k-i]
b[k-i+1]
进行比较,找出哪个元素肯定是O(1)。

现在我一直在尝试在某种二进制搜索中使用它来查找
a U b
中第k个最大的元素。我尝试了以下方法:我修改了算法以确定数组A中的元素是否大于或等于
A U B
中的第k个最大元素,然后对A进行二进制搜索,如果没有找到,则对数组B执行相同的操作。这具有O(logA+logB)复杂性。有没有办法在O(log(a+B))复杂度下做到这一点呢?@user2612743:本质上,O(logA+logB)与O(log(a+B))是一样的,因为它们之间的差异最多只有一个常数因子2。你是怎么得到的?难道O(logA+logB)=O(logA*B)不符合对数定律吗?这是如何渐近等价于O(log(A+B))?@user2612743:1<(log(A)+log(B))/log(A+B)<2。第二个不等式的粗略证明:2*log(A+B)>2*log(max(A,B))=log(max(A,B))+log(max(A,B))>=log(A)+log(B)。