【发布时间】:2011-06-04 09:19:41
【问题描述】:
我有以下面试问题。
有一个 nxn 元素的数组。该数组是部分排序的,即i 行中的最大元素小于i+1 行中的最小元素。
如何找到复杂度为 O(n) 的给定元素
这是我的看法:
您应该转到第 n/2 行。然后开始比较,例如您搜索 100,您看到的第一个数字是 110,所以您知道它在这一行或上面的行中,现在您转到 n/4 等等开。
来自cmets
一共不是 O(n * log n) 吗?他有 解析他的每一行 达到每个二分搜索,因此 线性搜索的次数是 乘以他的行数 将不得不平均扫描。 – 马丁 Matysiak 5 分钟前。
我不确定这是一个正确的解决方案。有人有更好的吗
【问题讨论】:
-
听起来对我来说是正确的。 O(log n) 减少到两个候选行,O(n) 找到这些行之一中的元素。总共是 O(n)。
-
在排序数组中你不能比二分搜索做得更好,在未排序数组中你不能比线性搜索做得更好,所以这对我来说似乎是最优的。
-
是正确的。二分搜索,然后是线性搜索。由于未排序的行,你不会比 O(n) 更好。
-
一共不是 O(n * log n) 吗?他必须解析每次二分搜索到达的每一行,因此线性搜索的数量乘以他必须扫描的平均行数。
-
我认为 Martin 是对的有没有人有想法这样做 O(n)?