【发布时间】:2012-01-04 07:34:34
【问题描述】:
设计一个算法,FindElement(a,p),其中“a”是具有重复的正整数的二维方阵,并且每行整数都按非降序排列: a[i][0]≤a[i][1]≤a[i][2]···≤a[i][n-1] (i=0,1,. . .,n-1),.该算法应定义 p 是否包含在 a 中。如果“p”成立,它应该返回 true,否则返回 false。 您的算法必须尽可能高效。算法应该基于二分查找
我找到了以下解决方案(但我不确定它是否正确):
解决方案是使用二进制搜索一次搜索在一行上工作的元素。对大小为 (n) 的给定排序行进行二进制搜索需要 O(Log(n)),因此在最坏的情况下搜索整个数组需要 O(nlog(n))。
这个解决方案是否适合给定的任务?我不知道如何实现这个算法,请你给我伪代码或解释如何做到这一点。 提前致谢。
【问题讨论】:
-
不清楚 1.你是搜索等于p的元素还是什么? 2. 如果有重复,输出是什么?所有事件的索引? 3. 你真的需要对这个任务使用二分查找吗(如果允许分配哈希表,有一个更有效的方法来实现这个请求)。请澄清问题陈述。
-
实际上,“方形/二维数组”是一个红鲱鱼 - 你在概念上(可能)有其他东西,允许在
O(log n)中执行整个搜索。当前的答案都没有提到这种可能性(不过@Amit 很接近)。这不需要分配哈希表,或者实际上除了用于O(n log n)搜索的变量之外的任何其他变量 - 您只需换个角度思考。我没有透露实际答案,因为我希望你考虑一下。哦,你没有提到你是否需要所有次出现,或者只需要一次(结果完全不同)。 -
使用完美哈希的搜索平均为您提供 O(1)(加上此特定情况的输出长度)。
-
好吧,我有点误读了规范。我概述的解决方案仅在所有情况下 a[i][n-1] ≤ a[i+1][0] 时才有效,此处可能不是。否则,您提出的解决方案应该可以正常运行。