{"id":20709,"date":"2021-05-14T18:15:27","date_gmt":"2021-05-14T16:15:27","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=20709"},"modified":"2025-06-12T09:11:57","modified_gmt":"2025-06-12T07:11:57","slug":"binaere-suche-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/binaere-suche-java\/","title":{"rendered":"Bin\u00e4re Suche (mit Java-Code)"},"content":{"rendered":"\n<p>Wir Entwickler stehen oft vor der Aufgabe in einem sortierten Array (oder in einer Liste) die Position eines gesuchten Elements zu bestimmen. Der einfachste Ansatz w\u00e4re das Array von links nach rechts zu durchlaufen und dabei jedes Element mit dem gesuchten Element abzugleichen. Das nennt man \"lineare Suche\". <\/p>\n\n\n\n<p>Deutlich schneller geht es mit der \"bin\u00e4ren Suche\". In diesem Artikel erf\u00e4hrst du:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wie funktioniert die Bin\u00e4rsuche?<\/li>\n\n\n\n<li>Wie implementiert man die bin\u00e4re Suche in Java (rekursiv und iterativ)?<\/li>\n\n\n\n<li>Welche bin\u00e4ren Suchfunktionen stellt das JDK zur Verf\u00fcgung?<\/li>\n\n\n\n<li>Wie schnell ist die bin\u00e4re Suche im Vergleich zur linearen Suche?<\/li>\n\n\n\n<li>Wann ist es sinnvoll in einer <code>LinkedList<\/code> bin\u00e4r zu suchen?<\/li>\n<\/ul>\n\n\n\n<p>Den Code zum Artikel findest du in diesem <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\" target=\"_blank\">GitHub-Repository<\/a>.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Bin\u00e4re Suche \u2013 ein Beispiel<\/h2>\n\n\n\n<p>Wenn wir fr\u00fcher ein unbekanntes Wort \u00fcbersetzen wollten, hatten wir daf\u00fcr keine App, sondern mussten dieses in einem W\u00f6rterbuch nachschlagen. Theoretisch k\u00f6nnte man nun von vorne nach hinten jede Seite von links oben nach rechts unten nach dem gew\u00fcnschten Wort durchsuchen.<\/p>\n\n\n\n<p>Mit etwas Gl\u00fcck finden wir das Wort auf den ersten Seiten des Buches. Wenn wir Pech haben, finden wir es erst gegen Ende des Buches \u2013 oder gar nicht (das w\u00fcrden wir erst auf der allerletzten Seite feststellen). Auch bei relativ weit vorne liegenden W\u00f6rtern (wie z. B. \"Bin\u00e4rsuche\") m\u00fcssten wir so ziemlich lange suchen.<\/p>\n\n\n\n<p>Diese Vorgehensweise nennt sich \"lineare Suche\". Das folgende Bild zeigt ein vereinfachtes Beispiel mit Zahlen statt W\u00f6rtern. Gesucht werden soll die Position der Zahl 61 im dargestellten Array.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"323\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-800x323.png\" alt=\"Lineare Suche in einem Zahlen-Array\" class=\"wp-image-20844\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-800x323.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-224x91.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-336x136.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-504x204.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-672x272.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-400x162.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-600x243.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3-944x382.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/linear-search-example-v3.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Lineare Suche in einem Zahlen-Array<\/figcaption><\/figure>\n<\/div>\n\n\n<p>In diesem vereinfachten Beispiel ben\u00f6tigen wir sechs Schritte, um die 61 zu finden.<\/p>\n\n\n\n<p>Nat\u00fcrlich w\u00fcrde in einem W\u00f6rterbuch niemand auf diese Weise suchen. Stattdessen schlagen wir das Buch ungef\u00e4hr in der Mitte auf und schauen, ob das Wort alphabetisch davor oder danach einzuordnen ist. Wir wissen somit, in welcher H\u00e4lfte des Buchs sich das Wort befindet und k\u00f6nnen die andere H\u00e4lfte ignorieren. Danach suchen wir wieder die Mitte und schr\u00e4nken den Suchbereich erneut auf die H\u00e4lfte (also insgesamt ein Viertel) ein. Mit jedem weiteren Suchschritt halbieren wir die Anzahl der verbleibenden Seiten. Auf diese Weise kommen wir in relativ wenigen Schritten zur Zielseite \u2013 und auf der Zielseite zum gesuchten Wort.<\/p>\n\n\n\n<p>Das nennt sich dann \"bin\u00e4re Suche\". Das folgende Bild macht deutlich, dass die Suche so wesentlich schneller zum Ergebnis f\u00fchrt als die lineare Suche:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"236\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-800x236.png\" alt=\"Bin\u00e4re Suche in einem Zahlen-Array\" class=\"wp-image-20843\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-800x236.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-224x66.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-336x99.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-504x149.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-672x198.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-400x118.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-600x177.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3-944x278.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-example-v3.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Bin\u00e4re Suche in einem Zahlen-Array<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Mit der Bin\u00e4rsuche brauchen wir lediglich drei Schritte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Im ersten Schritt vergleichen wir den gesuchten Wert 61 mit dem mittleren Element 36. Der gesuchte Wert ist gr\u00f6\u00dfer, muss sich also rechts von der 36 befinden.<\/li>\n\n\n\n<li>Im zweiten Schritt vergleichen wir die 61 mit dem mittleren Element des rechten Bereichs, der 79. Der gesucht Wert ist kleiner, muss sich also links von der 79 befinden.<\/li>\n\n\n\n<li>Zwischen 36 und 79 befindet sich nur noch ein Element. Auch dieses m\u00fcssen wir noch einmal mit dem gesuchten Element vergleichen. In diesem Beispiel haben wir das gesuchte Element 61 gefunden. Hier h\u00e4tte sich aber auch eine andere Zahl zwischen 36 und 79 befinden k\u00f6nnen. Das h\u00e4tte bedeutet, dass das Array gar keine 61 enth\u00e4lt.<\/li>\n<\/ol>\n\n\n\n<p>Die Bin\u00e4rsuche macht selbstverst\u00e4ndlich nur dann Sinn, wenn die W\u00f6rter im W\u00f6rterbuch (so wie die Zahlen im Beispiel) sortiert sind. W\u00fcrden die W\u00f6rter in zuf\u00e4lliger Reihenfolge abgedruckt sein, bliebe uns nichts anderes \u00fcbrig als Wort f\u00fcr Wort \u2013 also linear \u2013 zu suchen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bin\u00e4re Suche \u2013 Pseudocode<\/h2>\n\n\n\n<p>Im folgenden Pseudocode bezeichnen wir das gesuchte Element mit \"Schl\u00fcssel\" (im Englischen wird es mit \"key\" bezeichnet).<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Bestimme die mittlere Position des zu durchsuchenden Bereichs des Arrays.<\/li>\n\n\n\n<li>Lese das Element an der mittleren Position.<\/li>\n\n\n\n<li>Vergleiche den Schl\u00fcssel mit dem mittleren Element:\n<ul class=\"wp-block-list\">\n<li>Ist der Schl\u00fcssel <em>gleich<\/em> dem mittleren Element, dann haben wir das Ziel erreicht. Gebe die mittlere Position als Ergebnis zur\u00fcck.<\/li>\n\n\n\n<li>Ist der Schl\u00fcssel <em>kleiner<\/em> als das mittlere Element, dann f\u00fchre die Bin\u00e4rsuche im Teilarray <em>links<\/em> von der mittleren Position aus. Es sei denn, dieses Teilarray hat die L\u00e4nge 0, dann ist die Suche ohne Ergebnis beendet.<\/li>\n\n\n\n<li>Ist der Schl\u00fcssel <em>gr\u00f6\u00dfer<\/em> als das mittlere Element, dann f\u00fchre die Bin\u00e4rsuche im Teilarray <em>rechts<\/em> von der mittleren Position aus. Es sei denn, dieses Teilarray hat die L\u00e4nge 0, dann ist die Suche ohne Ergebnis beendet.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Implementierung von bin\u00e4rer Suche in Java<\/h2>\n\n\n\n<p>Die Bin\u00e4rsuche kann rekursiv oder iterativ implementiert werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bin\u00e4re Suche rekursiv<\/h3>\n\n\n\n<p>Die Pseudocode f\u00fcr die bin\u00e4re Suche aus dem vorherigen Kapitel legt eine rekursive Implementierung nahe.<\/p>\n\n\n\n<p>Die rekursive Implementierung in Java f\u00fcr ein Array von <code>int<\/code>-Primitiven sieht wie folgt aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">binarySearchRecursively<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span>&#091;] array, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> binarySearchRecursively(array, <span class=\"hljs-number\">0<\/span>, array.length, key);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">binarySearchRecursively<\/span><span class=\"hljs-params\">(\n    <span class=\"hljs-keyword\">int<\/span>&#091;] array, <span class=\"hljs-keyword\">int<\/span> fromIndex, <span class=\"hljs-keyword\">int<\/span> toIndex, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">if<\/span> (toIndex &lt;= fromIndex) <span class=\"hljs-keyword\">return<\/span> -<span class=\"hljs-number\">1<\/span>;\n\n  <span class=\"hljs-keyword\">int<\/span> mid = (fromIndex + toIndex) &gt;&gt;&gt; <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-keyword\">int<\/span> midVal = array&#091;mid];\n\n  <span class=\"hljs-keyword\">if<\/span> (key == midVal) {\n    <span class=\"hljs-keyword\">return<\/span> mid;\n  } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (key &lt; midVal) {\n    <span class=\"hljs-keyword\">return<\/span> binarySearchRecursively(array, fromIndex, mid, key);\n  } <span class=\"hljs-keyword\">else<\/span> {\n    <span class=\"hljs-keyword\">return<\/span> binarySearchRecursively(array, mid + <span class=\"hljs-number\">1<\/span>, toIndex, key);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Den Code findest du im GitHub-Repository in der Klasse <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/main\/java\/eu\/happycoders\/binarysearch\/BinarySearch.java#L12\" target=\"_blank\">BinarySearch ab Zeile 12<\/a>. Passende Unit-Tests dazu gibt es in <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/test\/java\/eu\/happycoders\/binarysearch\/BinarySearchTest.java\" target=\"_blank\">BinarySearchTest<\/a>.<\/p>\n\n\n\n<p>Wichtig ist hierbei die mittlere Position <code>mid<\/code> mittels \"unsigned right shift\" zu berechnen: <\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>int mid = (fromIndex + toIndex) &gt;&gt;&gt; 1 <\/code><\/p>\n\n\n\n<p>Und nicht wie folgt:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>int mid = (fromIndex + toIndex) \/ 2<\/code><\/p>\n\n\n\n<p>F\u00fcr den Fall dass die Summe gr\u00f6\u00dfer ist als <code>Integer.MAX_VALUE<\/code>, w\u00fcrde die zweite Variante zu einem Overflow bzw. einem \"Roll Over\" f\u00fchren, und das Ergebnis w\u00e4re eine negative Zahl. <\/p>\n\n\n\n<p>Ohne den <code>&gt;&gt;&gt;<\/code>-Operator w\u00e4re auch folgender Weg korrekt:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>int mid = fromIndex + (toIndex - fromIndex) \/ 2;<\/code><\/p>\n\n\n\n<p>Aber das ist l\u00e4ngst nicht so cool ;-)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bin\u00e4re Suche iterativ<\/h3>\n\n\n\n<p>Rekursion ben\u00f6tigt zus\u00e4tzliche CPU-Zyklen und zus\u00e4tzlichen Speicherplatz auf dem Heap. Daher sind iterative Implementierungen in der Regel vorzuziehen. <\/p>\n\n\n\n<p>Die entsprechende iterative Java-Implementierung f\u00fcr ein <code>int<\/code>-Array sieht wie folgt aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">binarySearchIteratively<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span>&#091;] array, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> binarySearchIteratively(array, <span class=\"hljs-number\">0<\/span>, array.length, key);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">binarySearchIteratively<\/span><span class=\"hljs-params\">(\n    <span class=\"hljs-keyword\">int<\/span>&#091;] array, <span class=\"hljs-keyword\">int<\/span> fromIndex, <span class=\"hljs-keyword\">int<\/span> toIndex, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> low = fromIndex;\n  <span class=\"hljs-keyword\">int<\/span> high = toIndex;\n\n  <span class=\"hljs-keyword\">while<\/span> (low &lt; high) {\n    <span class=\"hljs-keyword\">int<\/span> mid = (low + high) &gt;&gt;&gt; <span class=\"hljs-number\">1<\/span>;\n    <span class=\"hljs-keyword\">int<\/span> midVal = array&#091;mid];\n\n    <span class=\"hljs-keyword\">if<\/span> (key == midVal) {\n      <span class=\"hljs-keyword\">return<\/span> mid;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (key &lt; midVal) {\n      high = mid;\n    } <span class=\"hljs-keyword\">else<\/span> {\n      low = mid + <span class=\"hljs-number\">1<\/span>;\n    }\n  }\n\n  <span class=\"hljs-keyword\">return<\/span> -<span class=\"hljs-number\">1<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Variablen <code>low<\/code> und <code>high<\/code> sind hier nicht zwingend erforderlich. Man k\u00f6nnte innerhalb der <code>while<\/code>-Schleife auch <code>fromIndex<\/code> und <code>toIndex<\/code> ver\u00e4ndern. Methodenparameter zu \u00e4ndern gilt jedoch in der Regel als unsauberes Design.<\/p>\n\n\n\n<p>Auch diesen Code findest du in der <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/main\/java\/eu\/happycoders\/binarysearch\/BinarySearch.java#L52\" target=\"_blank\">Klasse BinarySearch ab Zeile 52<\/a>. Die Unit-Tests in <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/test\/java\/eu\/happycoders\/binarysearch\/BinarySearchTest.java#L64\" target=\"_blank\">BinarySearchTest ab Zeile 64<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bin\u00e4re Suche im JDK<\/h2>\n\n\n\n<p>Bin\u00e4re Suche in Arrays m\u00fcssen wir nat\u00fcrlich nicht selbst implementieren. Das JDK bietet bereits entsprechende Methoden f\u00fcr Arrays aller primitiven Datentypen und f\u00fcr Objekt-Arrays in der <code>java.util.Arrays<\/code>-Klasse. Au\u00dferdem bietet es eine Methode f\u00fcr die Bin\u00e4rsuche in Listen in der <code>java.util.Collections<\/code>-Klasse.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Arrays.binarySearch()<\/h3>\n\n\n\n<p>In einem <code>int<\/code>-Array k\u00f6nnen wir beispielsweise wie folgt suchen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">int<\/span>&#091;] array = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">int<\/span>&#091;] {<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">19<\/span>, <span class=\"hljs-number\">23<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">36<\/span>, <span class=\"hljs-number\">61<\/span>, <span class=\"hljs-number\">79<\/span>, <span class=\"hljs-number\">81<\/span>, <span class=\"hljs-number\">99<\/span>};\n<span class=\"hljs-keyword\">int<\/span> posOf36 = Arrays.binarySearch(array, <span class=\"hljs-number\">36<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Collections.binarySearch()<\/h3>\n\n\n\n<p>In einer entsprechenden <code>ArrayList<\/code> von <code>Integer<\/code>-Objekten k\u00f6nnen wir wie folgt suchen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">List&lt;Integer&gt; list = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;(List.of(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">19<\/span>, <span class=\"hljs-number\">23<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">36<\/span>, <span class=\"hljs-number\">61<\/span>, <span class=\"hljs-number\">79<\/span>, <span class=\"hljs-number\">81<\/span>, <span class=\"hljs-number\">99<\/span>));\n<span class=\"hljs-keyword\">int<\/span> posOf36 = Collections.binarySearch(list, <span class=\"hljs-number\">36<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Achtung: Die Methode <code>Collections.binarySearch()<\/code> kann f\u00fcr jede Klasse aufgerufen werden, die das <code>List<\/code>-Interface implementiert. Also beispielsweise auch f\u00fcr <code>LinkedList<\/code>.<\/p>\n\n\n\n<p>In einer verketteten Liste kann allerdings nicht direkt, sondern nur per Iteration auf ein bestimmtes Element zugegriffen werden, womit wir (fast) wieder bei der linearen Suche angekommen sind. Mehr dazu \u2013 und warum die Bin\u00e4rsuche auf einer <code>LinkedList<\/code> dennoch sinnvoll sein kann \u2013 erf\u00e4hrst du im n\u00e4chsten Kapitel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zeitkomplexit\u00e4t von bin\u00e4rer Suche<\/h2>\n\n\n\n<p>Bei der bin\u00e4ren Suche halbieren wir mit jedem Suchschritt die Anzahl der noch zu durchsuchenden Eintr\u00e4ge. Oder anders herum: wenn sich die Anzahl der Eintr\u00e4ge verdoppelt, brauchen wir nur einen Suchschritt mehr.<\/p>\n\n\n\n<p>Dies entspricht logarithmischem Aufwand, also <em>O(log n)<\/em>.<\/p>\n\n\n\n<p>Mehr \u00fcber die O- (bzw. Landau-) Notation erf\u00e4hrst du hier: <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">O-Notation und Zeitkomplexit\u00e4t \u2013 anschaulich erkl\u00e4rt<\/a><\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"5c918c0177\" src=\"https:\/\/happycoders.kit.com\/5c918c0177\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Laufzeit von bin\u00e4rer Suche<\/h3>\n\n\n\n<p>Mit dem Programm <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/main\/java\/eu\/happycoders\/binarysearch\/BinarySearchRuntime.java\" target=\"_blank\">BinarySearchRuntime<\/a> aus dem GitHub-Repository k\u00f6nnen wir die theoretisch hergeleitete Zeitkomplexit\u00e4t \u00fcberpr\u00fcfen. Das Programm generiert zuf\u00e4llige Arrays mit 10.000 bis 200.000.000 Elementen und sucht darin nach einem zuf\u00e4llig ausgew\u00e4hlten Element.<\/p>\n\n\n\n<p>Da die Zeiten im Bereich von Nanosekunden liegen, wird pro Messung nach 100 verschiedenen Keys gesucht. Die Messung wird f\u00fcr jede Array-Gr\u00f6\u00dfe 100 mal wiederholt; danach wird der Median ausgegeben. Der folgende Graph zeigt die mittlere Laufzeit in Abh\u00e4ngigkeit von der Array-Gr\u00f6\u00dfe:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-800x450.png\" alt=\"Laufzeit der Bin\u00e4rsuche in Abh\u00e4ngigkeit von der Array-Gr\u00f6\u00dfe\" class=\"wp-image-20800\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-800x450.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-224x126.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-336x189.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-504x284.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-672x378.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-400x225.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-600x338.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime-944x531.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-runtime.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Laufzeit der Bin\u00e4rsuche in Abh\u00e4ngigkeit von der Array-Gr\u00f6\u00dfe<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Der logarithmische Verlauf ist sehr gut zu erkennen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vergleich bin\u00e4re Suche vs. lineare Suche<\/h3>\n\n\n\n<p>Bei der linearen Suche finden wir im <em>best case<\/em> das gesuchte Element im ersten Schritt. Im <em>worst case<\/em> m\u00fcssen wir das komplette Array durchsuchen. Im <em>average case<\/em> die H\u00e4lfte der Eintr\u00e4ge. Bei <em>n<\/em> Eintr\u00e4gen sind das <em>n\/2<\/em> Suchschritte. Die Dauer der Suche steigt also linear mit der Anzahl der Eintr\u00e4ge. Wir sagen auch: <\/p>\n\n\n\n<p>Die Zeitkomplexit\u00e4t der linearen Suche betr\u00e4gt <em>O(n)<\/em>.<\/p>\n\n\n\n<p>Mit dem Programm <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/binary-search\/blob\/main\/src\/main\/java\/eu\/happycoders\/binarysearch\/LinearSearchRuntime.java\" target=\"_blank\">LinearSearchRuntime<\/a> k\u00f6nnen wir die Laufzeit der linearen Suche messen. Die folgende Grafik zeigt den Vergleich der Laufzeiten von bin\u00e4rer und der linearen Suche. Ich musste den Ausschnitt auf 100.000 Elemente verkleinern, um \u00fcberhaupt noch einen Anstieg der Messwerte f\u00fcr die Bin\u00e4rsuche erkennen zu k\u00f6nnen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-800x450.png\" alt=\"Vergleich der Laufzeiten von bin\u00e4rer und linearer Suche\" class=\"wp-image-20811\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-800x450.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-224x126.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-336x189.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-504x284.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-672x378.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-400x225.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-600x338.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-944x531.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Vergleich der Laufzeiten von bin\u00e4rer und linearer Suche<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Der lineare Aufwand der linearen Suche ist sehr gut zu erkennen. Auch wird deutlich, dass die bin\u00e4re Suche um Gr\u00f6\u00dfenordnungen schneller ist als die lineare. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Laufzeit von bin\u00e4rer Suche f\u00fcr kleine Arrays<\/h3>\n\n\n\n<p>Aufgrund der h\u00f6heren Komplexit\u00e4t des Codes der bin\u00e4ren Suche kann die lineare Suche f\u00fcr sehr kleine Arrays schneller sein. Das folgende Diagramm zeigt einen Ausschnitt des Vergleichs der Laufzeiten f\u00fcr bis zu 500 Elemente. Jeder Messpunkt ist der Median aus 100 Messungen mit jeweils 10.000 Wiederholungen.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-800x450.png\" alt=\"Bin\u00e4re und lineare Suche f\u00fcr kleine Arrays\" class=\"wp-image-20814\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-800x450.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-224x126.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-336x189.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-504x284.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-672x378.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-400x225.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-600x338.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays-944x531.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-vs-linear-search-small-arrays.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Bin\u00e4re und lineare Suche f\u00fcr kleine Arrays<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Das best\u00e4tigt die Vermutung. F\u00fcr Arrays bis maximal ca. 230 Elemente ist die lineare Suche schneller als die bin\u00e4re. Das ist nat\u00fcrlich keine allgemein g\u00fcltige Aussage, sondern gilt erstmal nur f\u00fcr meinen Laptop und das verwendete JDK.<\/p>\n\n\n\n<p>Man sieht auch noch einmal sch\u00f6n das lineare Wachstum \u2013 <em>O(n)<\/em> \u2013 im Vergleich zum logarithmischen Wachstum \u2013 <em>O(log n)<\/em>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Laufzeit von bin\u00e4rer Suche bei einer LinkedList<\/h3>\n\n\n\n<p>Im Kapitel <a href=\"#Binare_Suche_im_JDK\">Bin\u00e4re Suche im JDK<\/a> habe ich erw\u00e4hnt, dass die Methode <code>Collections.binarySearch()<\/code> auch auf eine <code>LinkedList<\/code> angewendet werden kann. <code>Collections.binarySearch()<\/code> unterscheidet intern nach Listen, die das <code>RandomAccess<\/code>-Interface implementieren, wie z. B. <code>ArrayList<\/code>, und nach anderen Listen. Bei Listen mit \"random access\" wird eine regul\u00e4re bin\u00e4re Suche durchgef\u00fchrt.  <\/p>\n\n\n\n<p>Um bei Listen ohne \"random access\" auf das mittlere Element zugreifen zu k\u00f6nnen, m\u00fcssen wir den Elementen vom Anfang bis zur Mitte Element f\u00fcr Element folgen. Von dort m\u00fcssten wir dann wiederum zur Mitte der linken oder rechten H\u00e4lfte der Liste Element f\u00fcr Element folgen. Die folgende Grafik soll dies verdeutlichen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"127\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-800x127.png\" alt=\"Bin\u00e4rsuche in einer doppelt verketteten Liste\" class=\"wp-image-20829\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-800x127.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-224x36.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-336x53.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-504x80.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-672x107.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-400x64.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-600x96.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list-944x150.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binary-search-linked-list.png 1200w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Bin\u00e4rsuche in einer doppelt verketteten Liste<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Um beispielsweise die Position der 19 zu suchen, m\u00fcssten wir erst den orangenen Pfeilen zur Mitte folgen, dann den blauen Pfeilen zur\u00fcck zur 23, und schlie\u00dflich dem gelben Pfeil zur 19.<\/p>\n\n\n\n<p>Das funktioniert so nur bei einer doppelt verketteten Liste. Bei einer einfach verketteten Liste m\u00fcsste man f\u00fcr die Iteration nach links immer wieder an den Anfang springen und von dort wieder den Pfeilen nach rechts folgen.<\/p>\n\n\n\n<p>Egal ob einfach oder doppelt verkettet \u2013 wir m\u00fcssen auf jeden Fall \u00fcber mehr Elemente iterieren als bei der linearen Suche. W\u00e4hrend wir bei der linearen Suche im Durchschnitt <em>n\/2<\/em> Suchschritte haben, iterieren wir bei der bin\u00e4ren Suche allein beim ersten Schritt zur Mitte schon \u00fcber <em>n\/2<\/em> Elemente. Beim zweiten Schritt noch einmal \u00fcber <em>n\/4<\/em> Elemente, beim dritten Schritt \u00fcber <em>n\/8<\/em> Elemente, usw.<\/p>\n\n\n\n<p>Auf den ersten Blick ergibt die Bin\u00e4rsuche in einer <code>LinkedList<\/code> also keinen Sinn.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wann ist die Bin\u00e4rsuche in einer LinkedList sinnvoll?<\/h3>\n\n\n\n<p>Dennoch kann die Bin\u00e4rsuche f\u00fcr eine <code>LinkedList<\/code> schneller sein als eine lineare Suche. Zwar m\u00fcssen wir (wie im vorherigen Abschnitt gezeigt) \u00fcber mehr Elemente iterieren \u2013 die Anzahl der <em>Vergleiche<\/em> bleibt aber in der Gr\u00f6\u00dfenordnung <em>O(log n)<\/em>!<\/p>\n\n\n\n<p>Je nach Kosten der Vergleichsfunktion \u2013 bei einem Objekt k\u00f6nnen diese deutlich h\u00f6her ausfallen als bei einem primitiven Datentyp \u2013 kann dies einen erheblichen Unterschied ausmachen. Solltest du also jemals in einer <code>LinkedList<\/code> suchen m\u00fcssen, dann lohnt es sich auf jeden Fall die Bin\u00e4rsuche mit <code>Collections.binarySearch()<\/code> auszuprobieren und mit der linearen Suche zu vergleichen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Dieser Artikel hat die Funktionsweise der bin\u00e4ren Suche und ihre Vorteile gegen\u00fcber linearer Suche bei sortierten Arrays und Listen aufgezeigt. Die theoretisch hergeleitete Zeitkomplexit\u00e4t wurde an einem Beispiel nachgewiesen. Au\u00dferdem wurde gezeigt, dass die Bin\u00e4rsuche auch bei einer doppelt verketten Liste sinnvoll sein kann.<\/p>\n\n\n\n<p>Ein sehr \u00e4hnliches Verfahren ist die Suche in einem <a href=\"\/de\/algorithmen\/binaerer-suchbaum-java\/\">Bin\u00e4ren Suchbaum<\/a>.<\/p>\n<aside><p>Wenn dir der Artikel weitergeholfen hat, w\u00fcrde ich mich sehr \u00fcber eine positive Bewertung auf meinem <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">ProvenExpert-Profil<\/a> freuen. Dein Feedback hilft mir, meine Inhalte weiter zu verbessern und motiviert mich, neue informative Artikel zu schreiben.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">Bewertung abgeben<\/a><\/p>\r\n                        <p>M\u00f6chtest du auf dem Laufenden bleiben und informiert werden, wenn neue Artikel auf HappyCoders.eu ver\u00f6ffentlicht werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"#\" data-formkit-toggle=\"d8ee997126\">Newsletter-Anmeldung<\/a><\/p><\/aside>","protected":false},"excerpt":{"rendered":"<p>Wie funktioniert die bin\u00e4re Suche? Wie implementiert man die bin\u00e4re Suche in Java? Welche bin\u00e4ren Suchfunktionen bietet das JDK? Wie schnell ist die bin\u00e4re Suche im Vergleich zur linearen Suche?<\/p>\n","protected":false},"author":1,"featured_media":20739,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie funktioniert bin\u00e4re Suche? Wie implementiert man bin\u00e4re Suche in Java? Welche Suchfunktionen bietet das JDK? Bin\u00e4re vs. lineare Suche.","_seopress_robots_index":"","_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":13897,"_post_count":0,"footnotes":""},"categories":[127],"tags":[136],"class_list":["post-20709","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-algorithmen-allgemein"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1200,675,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",300,169,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",768,432,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1024,576,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-224x126.jpg",224,126,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-336x189.jpg",336,189,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-504x284.jpg",504,284,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-672x378.jpg",672,378,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-400x225.jpg",400,225,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-600x338.jpg",600,338,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-800x450.jpg",800,450,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java-944x531.jpg",944,531,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1200,675,false],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",871,490,false],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1200,675,false],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1200,675,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2021\/05\/binaere-suche-java.jpg",1200,675,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Wie funktioniert die bin\u00e4re Suche? Wie implementiert man die bin\u00e4re Suche in Java? Welche bin\u00e4ren Suchfunktionen bietet das JDK? Wie schnell ist die bin\u00e4re Suche im Vergleich zur linearen Suche?","public_identification_id":"6bd85883c35c47038da5de928274f367","private_identification_id":"2ed2f53b0495489f8e09163604745c2d","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/20709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=20709"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/20709\/revisions"}],"predecessor-version":[{"id":52484,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/20709\/revisions\/52484"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/20739"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=20709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=20709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=20709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}