Algorithm 在日志(n)时间中搜索元素
我遇到了以下问题: 假设我修改一个4n个不同数字的给定排序列表,如下所示: 使元件保持在原来的均匀位置(位置2、4、6、…4n)。在奇数位置上形成n个不相交对(i,j),其中对于某些k=0到n,i=2k+1−对于某些k=n到2n,j=2k+1−一, 现在为每一对这样的元素交换位置i和j中的元素。(即数组前半部分奇数位置的每个元素与数组后半部分奇数位置的某个元素交换。没有任何元素涉及多个交换(即交换是不相交的)。您不知道这些(i,j)成对,但数组上半部分奇数位置的元素与下半部分奇数位置的元素交换。现在给出一个元素x,说明如何在O(logn)时间内确定x是否在(新重新排列的)数组中 老实说,我不知道如何处理这个问题。给定x,我可以使用二进制搜索来搜索它是否存在于任何偶数位置。但是奇数位置的数字不再排序Algorithm 在日志(n)时间中搜索元素,algorithm,sorting,complexity-theory,Algorithm,Sorting,Complexity Theory,我遇到了以下问题: 假设我修改一个4n个不同数字的给定排序列表,如下所示: 使元件保持在原来的均匀位置(位置2、4、6、…4n)。在奇数位置上形成n个不相交对(i,j),其中对于某些k=0到n,i=2k+1−对于某些k=n到2n,j=2k+1−一, 现在为每一对这样的元素交换位置i和j中的元素。(即数组前半部分奇数位置的每个元素与数组后半部分奇数位置的某个元素交换。没有任何元素涉及多个交换(即交换是不相交的)。您不知道这些(i,j)成对,但数组上半部分奇数位置的元素与下半部分奇数位置的元素交换。
非常感谢您的帮助。谢谢!您可以通过执行两次二进制搜索来确定某个元素
x
是否在新的(无序的)集合中。这里的关键是,奇数元素本质上充当彼此的“键”,因为它们已以不相交的对进行交换
x
,确保始终选择偶数索引进行比较。(使用偶数索引非常重要,因为这些是仍然有序的元素。)x
在数组中的索引为偶数,则会找到它。如果不是,我们最终会找到两个元素m
和n
,使得m
和索引(n)-索引(m)==2
。这意味着如果数组仍然被排序,x
必须是m
和n
之间的元素(如果它在数组中)m
和n
之间的索引处的元素-将其称为y
。如果元素x
位于原始数组中,则在创建无序数组时必须将其与y
交换y
,再次确保只选择偶数索引进行比较。与步骤2类似,最终将找到两个元素m'
和n'
,这样m'
和index(n')-索引(m'))==2
。如果数组仍然被排序,元素y
将是m'
和n'
之间的元素m'
和n'
之间的元素必须是与y
交换的元素,因此无论哪个元素最初位于m
和n
之间。如果该值不是x
,则x
在数组中不存在我被难住了。我想我们需要利用这样一个事实,如果x不是在偶数位置,那么它在2个偶数位置数字a和b之间,并且正好有1个奇数位置元素(在对半部分的某处)如果我们能在对半部分的奇数位置中找到一些a
x
是否在任何偶数位置上。如果不是,你可以比较2n
第四个位置,找出x
是否在原始数组的上部或下部,这意味着它可能是分别位于洗牌数组的下半部分或上半部分的奇数位置。但是,除非扫描数组相应半部分的所有n
奇数位置,否则无法找到它。这使得O(n)compexity.Brilliant!即使奇数位置的元素被分组为任意对,然后交换,这也会起作用,对吗?(即,要求每个交换对中的一个元素来自下半部分,而上半部分中的一个元素实际上是一种误导。)这表明,如果只需要一个O(logn),那么编码一组项目实际上有很大的灵活性成员资格测试…你知道有任何数据结构利用排序奇数位置项的自由度,也许是为了编码一些额外的信息吗?@j_random_hacker是的,我认为这是正确的。下半/上半交换约束可以用来稍微改进算法-例如,当我们开始第二次二进制搜索时我们已经知道要查看的是阵列的哪一半,但这还不足以造成很大的差异。