Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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
Algorithm 采访Q:给定一个大小未知的输入数组,所有数组都为1';开头是s,后面是0';最后是什么。在数组中查找索引,其中0';开始吧_Algorithm_Binary Search - Fatal编程技术网

Algorithm 采访Q:给定一个大小未知的输入数组,所有数组都为1';开头是s,后面是0';最后是什么。在数组中查找索引,其中0';开始吧

Algorithm 采访Q:给定一个大小未知的输入数组,所有数组都为1';开头是s,后面是0';最后是什么。在数组中查找索引,其中0';开始吧,algorithm,binary-search,Algorithm,Binary Search,在一次工作面试中,我被问到了以下问题 给定一个大小未知的输入数组,开头为1,结尾为0。在数组中查找从0开始的索引。考虑到数组中有1个和0个数组。数组非常大。例如数组内容1111111……1100000…………………… 这个问题最令人费解的是,如果我不知道数组的大小,我怎么知道*(array_name+index)是否属于数组??即使有人找到一个值从1变为0的索引,如何断言该索引属于数组 我能找到的最好的答案是O(logn)解,在这个解中,人们不断地加倍索引,直到找到0为止。同样,保证特定元素属于

在一次工作面试中,我被问到了以下问题


给定一个大小未知的输入数组,开头为1,结尾为0。在数组中查找从0开始的索引。考虑到数组中有1个和0个数组。数组非常大。例如数组内容1111111……1100000…………………… 这个问题最令人费解的是,如果我不知道数组的大小,我怎么知道*(array_name+index)是否属于数组??即使有人找到一个值从1变为0的索引,如何断言该索引属于数组

我能找到的最好的答案是O(logn)解,在这个解中,人们不断地加倍索引,直到找到0为止。同样,保证特定元素属于数组的保证是什么

编辑:
这是一个基于c的数组。约束条件是您没有end elem的索引(不能使用sizeof(arr)/sizeof(arr[0])。如果我在,比如说1024.arr[1024]==1。arr[2048]超出范围,因为数组长度为1029(程序员不知道)。那么,在找到解决方案时使用arr[2048]可以吗?它超出了范围,它的值可以是任何值。所以我想知道这个问题是否有缺陷。

为了找到0,我会进行二进制搜索

首先你选中间的,如果是1,你选右边,否则选左边。继续执行此操作,直到找到第一个0

现在,问题陈述是:给定一个大小未知的输入数组,所有1在开头,0在结尾。数组在内存中的表示方式是一个接一个的元素,因此,由于您知道数组末尾有0,如果您的算法工作正常,那么*(Array_name+index)肯定属于该数组

编辑:

对不起,我刚刚意识到,只有当您知道尺寸时,解决方案才有效。否则,是的,在我的脑海中,将索引加倍也是最好的算法。但是索引仍然属于数组这一事实的证明是相同的

因评论而编辑:

它表示在数组的末尾有0。所以如果你做一个简单的

int i;
while(i)
  if( *(array_name+i) != 1 )
       return i;
它应该给你第一个索引,对吗? 既然您知道数组看起来像1111…000000,那么您也知道0中至少有1个(即第一个)肯定属于该数组

在本例中,您可以通过将索引加倍,然后在index和index/2之间使用二进制搜索来执行搜索。在这里,您无法确定索引是否属于数组,但index和index/2之间的第一个0肯定属于数组(声明中说至少有一个0)


乌普丝。。。我刚刚意识到,如果你继续加倍索引,然后离开数组,你会发现“垃圾值”,这意味着它们可能不是0。因此,您可以做的最好的事情不是检查第一个0,而是检查第一个不是0的元素。遗憾的是,可能会有值为1的垃圾值(可能性极小,但可能会发生)。如果是这种情况,您需要使用O(n)算法。

我会使用二进制搜索来查找0

首先你选中间的,如果是1,你选右边,否则选左边。继续执行此操作,直到找到第一个0

现在,问题陈述是:给定一个大小未知的输入数组,所有1在开头,0在结尾。数组在内存中的表示方式是一个接一个的元素,因此,由于您知道数组末尾有0,如果您的算法工作正常,那么*(Array_name+index)肯定属于该数组

编辑:

对不起,我刚刚意识到,只有当您知道尺寸时,解决方案才有效。否则,是的,在我的脑海中,将索引加倍也是最好的算法。但是索引仍然属于数组这一事实的证明是相同的

因评论而编辑:

它表示在数组的末尾有0。所以如果你做一个简单的

int i;
while(i)
  if( *(array_name+i) != 1 )
       return i;
它应该给你第一个索引,对吗? 既然您知道数组看起来像1111…000000,那么您也知道0中至少有1个(即第一个)肯定属于该数组

在本例中,您可以通过将索引加倍,然后在index和index/2之间使用二进制搜索来执行搜索。在这里,您无法确定索引是否属于数组,但index和index/2之间的第一个0肯定属于数组(声明中说至少有一个0)


乌普丝。。。我刚刚意识到,如果你继续加倍索引,然后离开数组,你会发现“垃圾值”,这意味着它们可能不是0。因此,您可以做的最好的事情不是检查第一个0,而是检查第一个不是0的元素。遗憾的是,可能会有值为1的垃圾值(可能性极小,但可能会发生)。如果是这种情况,您需要使用O(n)算法。

如果您不知道数组的大小,可以从
index=1开始;在每一步中,检查
2*索引
是否大于数组的长度-如果大于或等于零-现在有一个边界来开始二进制搜索;否则
index=2*index
如果不知道数组的大小,可以从
index=1
开始;在每一步中,检查
2*索引
是否大于数组的长度-如果大于或等于零-现在有一个边界来开始二进制搜索;否则,
index=2*index

如果您不知道数组的长度,并且无法读取数组的末尾(因为它可能会出错或给您随机垃圾),那么