Я пытаюсь реализовать решения для поиска k-го наибольшего элемента в заданном целочисленном списке с дубликатами с O(N*log(N))
средней сложности времени в нотации Big-O, где N - количество элементов в списке., нарушающий заданную среднюю временную сложность в нотации Big-O
Согласно моему пониманию, Merge-sort имеет среднюю временную сложность O(N*log(N))
, однако в моем нижнем коде я фактически использую дополнительный цикл for вместе с алгоритмом mergesort для удаления дубликатов, который определенно нарушает мое правило найти k-й самый большой элемент с 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) время, вы получите минимум. Вы имели в виду k-й по величине из N предметов? – pjs
http://en.wikipedia.org/wiki/Selection_algorithm –
Ваш вопрос немного смущен. Невозможно найти n-й наибольший элемент в O (n log n). Подумайте о списке из 10 миллионов элементов, и вы хотите 4-й по величине. Вы говорите, что время выполнения вашего алгоритма должно регулироваться 4, а не 10 миллионами. Вероятно, вы имеете в виду самый большой элемент k в списке длины n. Теперь сделайте свой вид, для которого требуется O (n log n). Еще один проход, чтобы найти k'th наибольший, - это только O (n), поэтому общее время выполнения все еще O (n log n). Затем обратите внимание, что с осторожностью вы можете уменьшить это до O (n) с помощью предложения @ OliCharlesworth. – Gene