【问题标题】:How to find bounds of an array with unlimited size如何找到无限大小的数组的边界
【发布时间】:2014-12-28 07:29:02
【问题描述】:

最近在一次采访中遇到了这个问题。

我必须编写一个函数(带有参数,指向要查找的未知大小和数字的排序数组的开头的指针)来查找给定数字的索引。如果给定元素不存在于数组,我必须返回 -1。

我实际上是在尝试 log(n) 解决方案。

我的想法是在数组的 index-2 处查找元素。如果 index-2 处的元素小于给定的数字,则查看 index-4,如果元素仍然小于索引 8 和很快。

所以基本上这个想法是将 i 的值从 2 增加到 j 其中 arr[j]>给定数字,然后对 arr[j/2] 和 arr[j] 进行二分搜索。

但后来我陷入了如何处理数组中不存在给定元素的情况。

如何在 c++ 中处理这种情况,因为我认为 c++ 不会捕获越界异常?

任何想法都会有帮助...

【问题讨论】:

  • 我认为该算法在很大程度上取决于您尝试访问超出范围的元素时会发生什么。你问过面试官吗?如果你这样做了,请将他们的答案编辑到问题中。
  • 如果你不知道大小,你就无法避免超出结尾。
  • 你必须知道数组的大小,否则你正在看 UDB。
  • @AlanStokes:不一定。一种可能的设置可能是数组总是以+infinity(或其他事先已知的标记值)终止。因此,线性搜索将知道何时停止,但指数搜索将难以避免越过数组的末尾。这就是要求面试官澄清的关键所在。
  • @starkk92:那么下一个问题应该是如果我们要查找的数字大于数组的每个元素会发生什么。如何避免越过数组末尾的算法?

标签: c++ arrays


【解决方案1】:

如果在您的运行时可用并且内存分配在堆中,则只需使用此函数获取大小

http://msdn.microsoft.com/en-us/library/z2s077bc.aspx

做简单的二分查找

如果您想确保数字在数组中(在这种情况下不需要,但给您作为一般情况提示),您可以用哨兵替换数组中的一些可变变量(以避免调整大小)。

【讨论】:

    【解决方案2】:

    当您不知道数组的大小时,您无法执行 log(n) 解决方案。您可以做的是简单的线性搜索。这里的关键是数组是排序好的,这意味着如果你发现一个比你要找的那个大的项,那么这个项就不在这个数组中。

    迭代直到 A) 你找到你要找的项目或 B) 你找到一个比你要找的项目大的元素。如果 A) 返回当前索引,如果 B) 返回 -1。

    【讨论】:

    • 你不能进行线性搜索,因为 A) 你不能保证你会找到你要找的项目 B) 你不能保证你会找到一个更大的元素比您正在寻找的项目。例如,在一个用零填充的数组中查找数字 5 怎么样?数组排序!
    • 一个选项可能是将元素放在数组的末尾以确保它们存在,但您不知道数组的大小。有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多