我有一個整數數組,其中有一些有限數量的值。我的工作是找出數組中任意兩個元素之間的最小差異。找出數組元素之間的最小差異
認爲數組包含
4, 9, 1, 32, 13
這裏的區別是最小的4和1之間,因此答案是3
應該怎麼解決這個問題的算法。另外,我不知道爲什麼,但我覺得使用樹木可以相對容易地解決這個問題。可以這樣做嗎?
我有一個整數數組,其中有一些有限數量的值。我的工作是找出數組中任意兩個元素之間的最小差異。找出數組元素之間的最小差異
認爲數組包含
4, 9, 1, 32, 13
這裏的區別是最小的4和1之間,因此答案是3
應該怎麼解決這個問題的算法。另外,我不知道爲什麼,但我覺得使用樹木可以相對容易地解決這個問題。可以這樣做嗎?
最小差異將是排序順序中連續對之間的差異之一。排序的數組,經過對相鄰數字的尋找最小的區別:
int[] a = new int[] {4, 9, 1, 32, 13};
Arrays.sort(a);
int minDiff = a[1]-a[0];
for (int i = 2 ; i != a.length ; i++) {
minDiff = Math.min(minDiff, a[i]-a[i-1]);
}
System.out.println(minDiff);
好吧..我明白你的意思了。但排序本身將花費O(n.log n)時間。我只是好奇,但我們可以不分揀! – OneMoreError
@CSSS如果你做一個基數排序它是* O(n)* – oldrinb
@CSSS我認爲你可以做得比'O(N * LogN)'更快。您必須至少遍歷一次數組元素,並且對於每個元素,您需要找到最佳的「對應」進行減法。如果你使用樹,那麼你可以做的最好的就是'Log(N)'。 – dasblinkenlight
我想對他們O(nlogn)
堆然後彈出一個接一個,並得到之間的最小差值我彈出的每個元素。最後我會有最小的差異。但是,可能有更好的解決方案。
你可以採取的,你正在考慮整數 做出線性算法的事實優勢:
這在'N'中是線性的,但是也會對'max-min'產生線性依賴關係,這可能會使它非常糟糕。 – DarioP
這其實是中的closest-pair
問題的重述。 https://en.wikipedia.org/wiki/Closest_pair_of_points_problem http://www.cs.umd.edu/~samir/grant/cp.pdf
由於維基百科的文章援引低於所指出的,這個問題的最好的決策樹模型也運行在Ω(nlogn)
時間。
雖然所有的答案都是正確的,但我想顯示負責n log n
運行時間的底層算法。 分而治之找到兩點之間的最小距離或找到一維平面中最近點的方式。
的一般算法:
這是我在Javascript中創建了一個示例:
// Points in 1-D
var points = [4, 9, 1, 32, 13];
var smallestDiff;
function mergeSort(arr) {
if (arr.length == 1)
return arr;
if (arr.length > 1) {
let breakpoint = Math.ceil((arr.length/2));
// Left list starts with 0, breakpoint-1
let leftList = arr.slice(0, breakpoint);
// Right list starts with breakpoint, length-1
let rightList = arr.slice(breakpoint, arr.length);
// Make a recursive call
leftList = mergeSort(leftList);
rightList = mergeSort(rightList);
var a = merge(leftList, rightList);
return a;
}
}
function merge(leftList, rightList) {
let result = [];
while (leftList.length && rightList.length) {
// Sorting the x coordinates
if (leftList[0] <= rightList[0]) {
result.push(leftList.shift());
} else {
result.push(rightList.shift());
}
}
while (leftList.length)
result.push(leftList.shift());
while (rightList.length)
result.push(rightList.shift());
let diff;
if (result.length > 1) {
diff = result[1] - result[0];
} else {
diff = result[0];
}
if (smallestDiff) {
if (diff < smallestDiff)
smallestDiff = diff;
} else {
smallestDiff = diff;
}
return result;
}
mergeSort(points);
console.log(`Smallest difference: ${smallestDiff}`);
http://en.wikipedia.org/wiki/Closest_pair_of_points_problem – Rsh
你的意思是你要解決此http:/ /www.codechef.com/SEP12/problems/HORSES – nikhil
是的..我問這個問題的基礎上! – OneMoreError