[英]Binary search in 2 dimensional array with duplicates Java
設計一個算法,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))來搜索整個數組。
這個解決方案是否適合於給定的任務? 我不知道如何實現這個算法,請你給我偽代碼或解釋如何做到這一點。 提前致謝。
是的,您的解決方案似乎是正確和有效的(鑒於您對初始問題的描述,他們可能希望您使用二進制搜索)。 你的算法應該是這樣的:
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
是解決方案是正確的。
這是偽代碼
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的第一次出現。
您可以根據您的硬件修改它。
以下是我如何看待這個問題:
有蠻力的方式,半蠻力的方式和有效的方式。 我沒有看到這里列出的有效方式。
假設它是一個方陣,n =行數/列數
蠻力方式是線性搜索一切,O(n ^ 2),
您的方法(以及列出的其他答案),O(n log n),
更有趣的答案,2D二進制搜索。
假設您有一個在矩陣中搜索值的函數,
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。 此解決方案不適用於該問題。
二進制搜索僅適用於排序列表。 所以,如果它是合適的:我會說是的。 當你得到所有重復的答案時,請確保你前進和后退。
您可以將此作為基礎: http : //www.java-tips.org/java-se-tips/java.lang/binary-search-implementation-in-java.html
在現實生活中,如果我能保證數據的排序,我會使用java.util.Arrays.binarySearch。 我使用Arrays.sort函數對數組進行排序或使用TreeMap / TreeSet加載數據並使用get函數。
如果我正確理解你的問題描述,那么你在各行之間沒有任何關系/約束,對嗎? 只是單行中的元素按升序排序。
如果你需要搜索很多,只需將矩陣作為列表讀取並再次排序。 這需要N ^ 2 * log(N)的時間。 之后,只在該折疊列表上進行二進制搜索,該列表再次按log(N)的順序作為log(N ^ 2)= 2 * log(N)。
可以將預處理包含在搜索時間中的收支平衡點是您至少搜索N次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.