我想實現一個解決方案,以找到第k大元素與那些在大O符號O(N*log(N))
平均時間複雜度,其中N是重複一個給定的整數列表列表中的元素數量。違反在大O符號給定的平均時間複雜度
按我的理解合併排序具有但是在我下面的代碼,我實際使用一個額外的for循環與歸併算法一起刪除重複這肯定是侵犯了我的發現規則第k大的O(N*log(N))
的平均時間複雜度元素與O(N*log(N))
。我如何通過完成我的任務O(N*log(N))
Big-O表示法的平均時間複雜性?這裏
public class FindLargest {
public static void nthLargeNumber(int[] arr, String nthElement) {
mergeSort_srt(arr, 0, arr.length - 1);
// remove duplicate elements logic
int b = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[b] != arr[i]) {
b++;
arr[b] = arr[i];
}
}
int bbb = Integer.parseInt(nthElement) - 1;
// printing second highest number among given list
System.out.println("Second highest number is::" + arr[b - bbb]);
}
public static void mergeSort_srt(int array[], int lo, int n) {
int low = lo;
int high = n;
if (low >= high) {
return;
}
int middle = (low + high)/2;
mergeSort_srt(array, low, middle);
mergeSort_srt(array, middle + 1, high);
int end_low = middle;
int start_high = middle + 1;
while ((lo <= end_low) && (start_high <= high)) {
if (array[low] < array[start_high]) {
low++;
} else {
int Temp = array[start_high];
for (int k = start_high - 1; k >= low; k--) {
array[k + 1] = array[k];
}
array[low] = Temp;
low++;
end_low++;
start_high++;
}
}
}
public static void main(String... str) {
String nthElement = "2";
int[] intArray = { 1, 9, 5, 7, 2, 5 };
FindLargest.nthLargeNumber(intArray, nthElement);
}
}
如果你想第N個最大的N項,聽起來像你想的最小值。爲什麼不遍歷清單,跟蹤當前的最小值。當您在O(N)時間結束時,您將達到最低限度。你的意思是N項中最大的第k個? – pjs
http://en.wikipedia.org/wiki/Selection_algorithm –
你的問題是有點混亂。在O(n log n)中找到第n個最大元素是不可能的。考慮一千萬個元素的列表,你想要第4個最大的元素。你說你的算法的運行時間應該由4而不是1000萬來管理。你可能是指長度爲n的列表中第k個最大的元素。現在做你的排序,這需要O(n log n)。再次發現第k個最大值僅爲O(n),因此整體運行時間仍然是O(n log n)。然後請注意,小心你可以用@ OliCharlesworth的建議將它減少到O(n)。 – Gene