Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 二进制搜索修改_C_Binary Search - Fatal编程技术网

C 二进制搜索修改

C 二进制搜索修改,c,binary-search,C,Binary Search,我一直在试图解决以下问题。我有一系列的积极因素 整数,可以是非常长的数百万个元素。这 序列可以包含元素值中的跳转。上述跳跃 表示两个连续元素彼此相差超过1 示例01: 12345670 在上述示例中,跳转发生在7和0之间 从时间的角度来看,我一直在寻找一些有效的算法 查找发生此跳转的位置。这个问题因环境问题而变得复杂 事实上,可能存在两次跳跃和其中一次跳跃的情况 是我正在寻找的跳跃,另一个是我正在寻找的环绕 我不是在找你 示例02: 91234678 在这里,9和1之间的第一次跳跃是环绕。第二跳

我一直在试图解决以下问题。我有一系列的积极因素 整数,可以是非常长的数百万个元素。这 序列可以包含元素值中的跳转。上述跳跃 表示两个连续元素彼此相差超过1

示例01:

12345670

在上述示例中,跳转发生在7和0之间

从时间的角度来看,我一直在寻找一些有效的算法 查找发生此跳转的位置。这个问题因环境问题而变得复杂 事实上,可能存在两次跳跃和其中一次跳跃的情况 是我正在寻找的跳跃,另一个是我正在寻找的环绕 我不是在找你

示例02:

91234678

在这里,9和1之间的第一次跳跃是环绕。第二跳 4和6是我正在寻找的跳跃


我的想法是以某种方式修改二进制搜索算法,但我不确定这是否可能,因为环绕的存在。值得一提的是,最多只能发生两次跳跃,在这些跳跃之间,元素被排序。有人知道吗?提前感谢您的建议。

您无法找到一个有效的解决方案。高效的意思是不查看所有数字,因为您无法通过查看少于所有的数字来总结任何数字。例如,若你们只看每一秒的数字仍然在,但更好的因素,你们会错过像这样的双跳:1 5 3。你可以而且必须查看每一个数字,并将其与它的邻居进行比较。您可以分割工作负载并使用多核方法,但仅此而已

更新

如果你有一个特殊情况,在你的列表中只有一个跳转,其余的被排序,例如1 2 3 7 8 9,你会发现这个跳转相当有效。你不能使用普通的二进制搜索,因为列表可能没有被完全排序,你不知道你在搜索什么数字,但是你可以使用指数搜索的缩写,它有一些相似之处

我们需要以下假设才能使该算法工作:

只有一个跳转,我忽略环绕跳转,因为从技术上讲,它不在以下任何元素之间 列表以其他方式排序,并且严格单调递增 有了这些假设,我们现在基本上是在寻找我们单调性的一个中断。这意味着我们正在搜索2个元素和b之间有n个元素但不满足b=a+n的情况。如果两个元素之间没有跳转,则这必须为真。现在,您只需要找到不以非线性方式满足此要求的元素,因此采用指数方法。此伪代码可以是这样一种算法:

let numbers be an array of length n fulfilling our assumptions

start = 0
stepsize = 1
while (start < n-1)
    while (start + stepsize > n)
        stepsize -= 1
    stop = start + stepsize
    while (numbers[stop] != numbers[start] + stepsize)
        // the number must be between start and stop
        if(stepsize == 1)
            // congratiulations the jump is at start to start + 1
            return start
        else
            stepsize /= 2
    start += stepsize
    stepsize *= 2

no jump found

解决方案的速度不能超过至少一次完全遍历列表的速度,因为您需要至少查看一次每个数字,因为您不能仅查看少于一个数字就得出任何关于您的数字的结论all@Mr.Yellow非常感谢您的评论。我一直在考虑二进制搜索。一个想法是,我将多次使用二进制搜索。在第一次使用过程中,我将确定环绕发生的位置,并基于此信息,将序列划分为两个子序列,以便二元搜索的另一次使用。你觉得这个主意怎么样?谢谢。二进制搜索的问题是它只能用于排序列表。由于您的问题与排序列表排序无关,它会破坏您正在搜索的信息,因此无法应用二进制搜索。非常感谢您的回答。如果我有一个信息,最多只出现两次跳跃,是否可以使用二进制搜索。其中一个是包裹,另一个是我正在寻找的?在这两个跳跃之间,元素被排序。我在上面更新了答案,回答了你的问题