设计一个算法,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))来搜索整个数组。
此解决方案是否适合特定任务?我不知道如何实现这个算法,请你给我伪代码或解释如何做到这一点。 提前谢谢。
答案 0 :(得分:1)
是的,您的解决方案似乎正确且有效(鉴于您对初始问题的描述,他们可能希望您使用二进制搜索)。你的算法应该是这样的:
public Point FindElement(int[][] matrix, int number) {
Point p = new Point(); // holds two integers and represents
// a position in the matrix.
int found = -1;
for(int i = 0; i < N; i++) {
found = binarySearch(matrix[i], number, 0, N);
if(found != -1) {
p.setX(i);
p.setY(found);
return p;
}
}
return null;
}
可以根据此处的伪代码实现二进制搜索:http://en.wikipedia.org/wiki/Binary_search_algorithm#Recursive
答案 1 :(得分:1)
是的解决方案是正确的。
这是伪代码
int index = -1;
for (int i : height of array){
int[] putIn1Darray = a[i][j] where j = 0 to n;
index = Arrays.binarySearch(putIn1Darray,p);
if (index == -1)
//Element not found yet
continue;
else
//Element found
break;
}
print index;
上述算法用于显示元素p的第一次出现。
您可以根据您的硬件修改它。
答案 2 :(得分:0)
二进制搜索仅适用于排序列表。所以,如果它是合适的:我会说是的。当你得到所有重复的答案时,请确保你前进和后退。
您可以将此作为基础: http://www.java-tips.org/java-se-tips/java.lang/binary-search-implementation-in-java.html
答案 3 :(得分:0)
在现实生活中,如果我能保证数据的排序,我会使用java.util.Arrays.binarySearch。我使用Arrays.sort函数对数组进行排序或使用TreeMap / TreeSet加载数据并使用get函数。
答案 4 :(得分:0)
如果我正确理解了您的问题描述,那么您在各行之间没有任何关系/约束,对吧?只是单行中的元素按升序排序。
如果你需要经常搜索,只需将矩阵作为列表阅读并再次排序。这需要N ^ 2 * log(N)的时间。之后只需在该折叠列表上进行二进制搜索,该列表将再次按log(N)的顺序作为log(N ^ 2)= 2 * log(N)。
预处理可以包含在搜索时间中的收支平衡点是您至少搜索N次。
答案 5 :(得分:0)
以下是我如何看待这个问题:
有蛮力的方式,半蛮力的方式和有效的方式。 我没有看到这里列出的有效方式。
假设它是一个方阵,n =行数/列数
蛮力方式是线性搜索一切,O(n ^ 2),
您的方法(以及列出的其他答案),O(n log n),
更有趣的答案,二维二分法搜索。
假设您有一个在矩阵中搜索值的函数,
boolean findInMatrix(a, p)
{
if(a == null)
return false;
//Compare the middle of the matrix with p
if(p == a[n/2][n/2])
return true;
if(a.length == 1)
return false;
if p < a[n][n], then
return findInMatrix(top left, p) || findInMatrix(bottom left, p) || findInMatrix(top right, p);
else
return findInMatrix(bottom right, p) || findInMatrix(bottom left, p) || findInMatrix(top right, p);
}
砰的一声,完成了。当然,您需要处理如何传入矩阵的一部分进行搜索,您可以通过传入2D范围来使用就地方法,也可以复制矩阵。
如您所见,它在每次迭代时都是二进制搜索x 3。复杂性应该仍然是O(log N),其中N是细胞总数,n ^ 2.
这个解决方案的灵感来自于我认为我们应该充分利用给定的属性,而不仅仅是使用一半的一维排序搜索。
如果我的解决方案有误,请告诉我。
注意:哎呀,我把这个问题误读为Clockwork-Muse。此解决方案不适用于该问题。