Gegeben sind alle Zahlen im Bereich von 0 bis n-1, wobei n die Länge des Arrays ist.
Wie löst man das in linearer Zeit und konstantem Raum?Häufigstes Element in einem Array
Antwort
Sie können gegebenen Array als Zähler für Zahlen wiederverwenden. Iterieren Sie einfach das Array und inkrementieren Sie den entsprechenden Zähler. Der einzige Trick ist, jedes Mal um n zu inkrementieren, nicht von einer:
for (int i = 0; i < n; ++i) {
arr[arr[i]%n] += n;
}
Nach diesem Schleifenelement arr [i] verändert wird, um arr [i] + n * count [i], wobei arr [i ] < n. Auf diese Weise ist das häufigste Element dasjenige mit dem größten Wert. Um den ursprünglichen Wert wiederherzustellen, nehmen Sie einfach arr [i]% n.
Warum brauchen wir%, wenn alle Elemente kleiner als n-1 sind? –
Das liegt daran, dass Sie beim Iterieren die Werte auf etwas Größeres als n erhöhen. Wenn zum Beispiel n = 3 ist und Sie das Array 2,2,2 haben, dann hätten Sie nach der ersten Iteration das Array 2,2,5; nach der zweiten Iteration 2,2,8; und nach der letzten Wiederholung musst du 2,2,11 bekommen. Dies ist nur möglich, wenn Sie einen Rest zum Abrufen des Array-Elements verwenden. –
oh ja, verpasst das, danke sowieso! –
Hier ist eine Funktion, um dies zu erreichen. Aber es ist nicht O (n), wie du es verlangst, es ist O (n^2). Hoffe, diese Hilfe
function getPopularElement(array) {
var count = 1, tempCount;
var popular = array[0];
var temp = 0;
for (var i = 0; i < (array.length - 1); i++) {
temp = array[i];
tempCount = 0;
for (var j = 1; j < array.length; j++) {
if (temp == array[j]) {
tempCount++;
}
}
if (tempCount > count) {
popular = temp;
count = tempCount;
}
}
return popular;
}
schätze deine Antwort, danke! –
Heller's Lösung ist eigentlich ähnlich: Die Idee ist, durch das Array zu gehen und für jedes Element einen Zähler an der Position dieser Zahl im Array zu erhöhen. Im Allgemeinen gibt es ein anderes Element an dieser Position (wo Heller die Information durch Zählen in Schrittgrößen von n
hält) aber können wir diese Elemente rekursiv und in-Place auflösen. Dies ist ein linearer Prozess, der höchstens einmal pro Element ausgeführt wird, da es keine Ketten mehr geben kann (versuchen, die Anzahl an einer Position zu erhöhen, ein neues Element zu finden) als die Länge des gesamten Arrays (dh ein einzelner Permutationszyklus) und einmal Ein Element wird verarbeitet, es kann in der Hauptschleife übersprungen werden, wodurch es insgesamt O(n)
wird. Der Trick ist, um den Zähler zu verringern:
//input: arr
//output: most frequent element, number of occurrences
n <- arr.length
for i = 0..n-1
val <- arr[i]
if val < 0
// this element has already been processed
continue
// set counter at i to zero (-1)
arr[i] <- -1
// resolve the chain
do
idx <- val
val <- arr[idx]
if val < 0
// arrived at a counter, end of chain
// increase the counter by one (-1)
arr[idx] <- arr[idx] - 1
break
}
// otherwise continue the chain with val
// and initialise the counter at idx to one (-2)
arr[idx] <- -2
// find the most common element
idx <- 0
for i = 1..n-1
// smaller value means larger counter
if arr[i] < arr[idx]
idx <- i
// [the most frequent element, number of occurrences]
output [idx, -(arr[idx] + 1)] // arr[i] = -1 - #occurrences
Diese Lösung auch schön mit sehr großen Arrays beschäftigt, wo die größten möglichen Gegen in Heller-Lösung (n*n-1
) die zugrunde liegende ganze Zahl überlaufen (für 32-Bit-Integer, die Arrays länger ist als 65535 Elemente!)
- 1. Häufigstes Array-Element in tableView
- 2. Min/Max und häufigstes Element einer Liste
- 3. Berechnung des Modus (häufigstes Element) einer Menge in linearer Zeit?
- 4. Zweitletztes Element in einem Array in C
- 5. Peak-Element in einem Array in c
- 6. Löschen Element in Array, in einem anderen Array in Swift
- 7. Object.assign das Array-Element in einem Objekt
- 8. Erstes minus letztes Element in einem Array
- 9. K'th kleinste Element in einem Array
- 10. Javascript target ein Element in einem Array
- 11. ein Element in einem dynamischen Array
- 12. Häufigste Element in einem String-Array, MATLAB
- 13. Verweis auf Element in einem PHP-Array
- 14. Das fehlende Element in einem Array finden
- 15. Finden Element in einem Array, die nicht
- 16. Element hinzufügen in Array
- 17. Suche nach einem Element in einem Array mit jQuery.inArray()
- 18. Wie kann ein Array-Element aus einem Vergleich mit einem anderen Array-Element entfernt werden?
- 19. Java: String-Array-Element [] einem String zuweisen?
- 20. Bindung QML zu einem Array-Element
- 21. Überprüfen Sie, ob sich jedes Element in einem numplien Array in einem anderen Array befindet
- 22. in einem Array ein Element aktualisieren, die in einem Array ist
- 23. LINQ - Array-Eigenschaft enthält Element aus einem anderen Array
- 24. Löschen Sie ein bestimmtes Element in einem Array in Javascript
- 25. Wie das Element Index in einem Array in WINKEL JS
- 26. Löschen Element mit einem bestimmten Wert aus einem Array
- 27. Wie aktualisiert man ein Element in einem ES6-Array?
- 28. Wie ein bestimmtes Element in einem mehrdimensionalen Array
- 29. Finden Sie das nächste größere Element in einem Array
- 30. Code optimieren - Maximales Element in einem Array mit Funktionen
* alle Zahlen sind im Bereich von 0 bis n-1 * und * sind positiv * kombiniert zu * alle Zahlen sind im Bereich 1 bis n-1 *, oder sind das zwei getrennte Fragen? – BeyelerStudios