Ich suche nach einer Möglichkeit, einen Code in Java zu implementieren, die die gleiche Art und Weise wie eine binäre Suche in einer geordneten Arraylist, aber für eine geordnete Liste DankBinary Suche in einer geordneten Liste in java
Antwort
Der Algorithmus arbeitet sollte das gleiche für eine ArrayList
und eine List
, vorausgesetzt sie sind beide bestellt.
Sie sollten auch daran denken, dass Sie keine Binärsuche durchführen können, wenn die Liste nicht geordnet ist. Es macht keinen Sinn. Binäre Suche ist O(log n)
, weil Sie an jeder Stelle die Hälfte der Liste ignorieren können, da Sie wissen, dass es geordnet ist. Wenn die Liste nicht geordnet ist, ist Ihre Suche O (n) und Sie können keine Binärdatei verwenden.
Ihre eigene Implementierung für binäre Suche sollte wie folgt aussehen:
int binary_search(int A[], int key, int imin, int imax)
{
// test if array is empty
if (imax < imin)
// set is empty, so return value showing not found
return KEY_NOT_FOUND;
else
{
// calculate midpoint to cut set in half
int imid = midpoint(imin, imax);
// three-way comparison
if (A[imid] > key)
// key is in lower subset
return binary_search(A, key, imin, imid-1);
else if (A[imid] < key)
// key is in upper subset
return binary_search(A, key, imid+1, imax);
else
// key has been found
return imid;
}
}
Quelle: Wikipedia
Wenn Sie möchten, dann java.util Implementierung verwenden verwenden:
java.util.Arrays.binarySearch(int[] a, int key)
Array a
sollte natürlich sortiert werden.
Ich denke er hat sich daran erinnert, deshalb hat er in seiner Frage das Wort "ordered" verwendet ... – ajb
was ist dann der Unterschied zwischen List und ArrayList? bedeutet er geordnetes Array vs. Arraylist? –
Eine ArrayList ist eine Implementierung einer Liste. Eine Liste ist eine Sequenz von Elementen. Eine ArrayList ist eine Möglichkeit, diese Elemente darzustellen. LinkedList ist ein anderer. Ich denke ArrayList hält die Elemente in einer Array-ähnlichen Struktur, so dass der Zugriff auf ein Element in einem bestimmten Index schnell ist, aber einige Operationen wie das Einfügen in der Mitte der Liste sind langsamer. LinkedList macht es schneller, in die Mitte einzufügen, aber langsamer, um das N-te Element der Liste zu erhalten. Keiner von denen sagt etwas darüber aus, ob die Elemente in einer sortierten Reihenfolge sind. – ajb
"Binäre Suche" macht nur Sinn, wenn die Elemente der Liste (oder irgendeine Art von Zeigern auf die Elemente) sequenziell im Speicher organisiert sind, so dass, wenn Sie wissen, dass Ihre Suche auf die Indizes Low und High eingeschränkt wurde. Sie können direkt zu dem Element springen (Low + High)/2, ohne alle anderen Elemente durchgehen zu müssen. Dies wird für eine allgemeine Liste nicht funktionieren, die eine LinkedList sein könnte. Für so etwas kann man nicht wirklich besser sein, als am Anfang der Liste zu beginnen und alle Elemente der Reihe nach durchzugehen.
können Sie
Collections.<T>binarySearch(List<T> list, T key)
für binäre Suche auf jedem List
verwenden. Es funktioniert auf ArrayList
und auf LinkedList
und auf jedem anderen List
.
jedoch:
binäre Suche ist schnell nur, wenn Sie den direkten Zugriff auf jedes Element haben:
Dieses Verfahren läuft in log (n) Zeit für einen "random access" Liste (die in der Nähe bietet -konstanzal positionsabhängiger Zugriff). Wenn die angegebene Liste die RandomAccess-Schnittstelle nicht implementiert und groß ist, führt diese Methode eine iteratorbasierte binäre Suche durch, die O (n) -Transaktionen und O (log n) -Elementvergleiche durchführt.
Wenn Ihr List
bietet keine „random access“ Sie mehr Glück, indem Sie eine Kopie dieser List
haben könnten, das dies tut liefern.
LinkedList<String> list = new LinkedList<String>();
// fill
Entweder wie so
ArrayList<String> fastList = new ArrayList<String>(list);
Collections.binarySearch(fastList, "Hello World");
oder vielleicht wie so
String[] array = list.toArray(new String[list.size()]);
Arrays.binarySearch(array, "Hello World");
Wenn Ihr List
ist standardmäßig nicht bestellt und haben Sie es zu sortieren, bevor suchen Sie vielleicht das beste bekommen Ergebnis, indem Sie es mit Arrays seit
Collections.sort(list);
tun 0
erstellt ein temporäres Array, das sortiert und zum Erstellen der Liste verwendet wird, die Sie verhindern können, wenn Sie dies direkt mit Arrays tun.
String[] array = list.toArray(new String[list.size()]);
Arrays.sort(array);
Arrays.binarySearch(array, "Hello World");
- 1. Verwenden einer geordneten Liste in IndexedDB
- 2. Listenelemente in Listenelementen einer geordneten Liste verschachteln?
- 3. Leistung einer geordneten Liste in Firebase
- 4. Auflösen mehrdeutiger Kategorien in einer geordneten Liste
- 5. Binary Suche auf einer std :: string Array
- 6. Ist die binäre Suche nach einer geordneten Liste O (logN) in Elixir?
- 7. Sortieren einer Liste von einem geordneten Index
- 8. Wie Suche in einer Liste
- 9. Ändern Sie die Nummerierung in einer geordneten Liste?
- 10. Funktion zum Erkennen von Änderungen in einer geordneten Liste
- 11. Abrufen der Werte in einer nicht geordneten Liste und Listenelemente
- 12. String-Matching in einer alphabetisch geordneten Liste (der MATLAB-Weg)
- 13. Binary Suche nach Liste, aber nicht für Satz
- 14. Java: Suche nach einem Objekt in einer großen Liste
- 15. Suche nach geordneten und ungeordneten Listen
- 16. Java binäre Suche Array-Liste
- 17. Suche in einer Liste innerhalb von Listen
- 18. Suche in einer Liste von Dateien
- 19. Binäre Suche in einer Python-Liste
- 20. Suche in einer Liste <DataRow>?
- 21. Größe einer Liste in Java
- 22. Suche in verketteten Liste mit Scanner in Java
- 23. Liste der geordneten Tupel als CSV speichern
- 24. Suche nach einem Array oder Liste in einer Liste
- 25. Wie wähle ich ein Listenelement aus einer geordneten Liste?
- 26. C: Erstellen einer geordneten Liste durch Überprüfen von 2 Werten
- 27. Binary Suche auf dem Vektor von structs
- 28. Symfony 2 Doctrine Suche nach geordneten Array von ID
- 29. Entfernen Sie den linken Abstand von einer geordneten Liste (OL)
- 30. Persistent Binary Tree/Hash-Tabelle in. NET
Es gibt nette Hilfsklassen mit vielversprechenden Namen wie 'Collections.binarySearch()' oder 'Arrays.binarySearch()', die mit jedem Java mitgeliefert werden. – zapl
Hallo, wenn Sie downvotes bekommen, wird es sein, weil Sie keine Mühe zeigen, sollten Sie versuchen, das Problem anzugehen, bevor Sie eine Frage stellen. – jsedano
Das macht nicht wirklich viel Sinn. Eine Liste ist keine Datenstruktur, die einen Direktzugriff erlaubt. Sie können keine Binärsuche ohne diese Option durchführen. – piokuc