{"id":4045,"date":"2024-09-19T13:05:15","date_gmt":"2024-09-19T11:05:15","guid":{"rendered":"https:\/\/www.capri-soft.de\/blog\/?p=4045"},"modified":"2024-09-19T13:05:15","modified_gmt":"2024-09-19T11:05:15","slug":"algorithmen-und-datenstrukutren-binaere-suche-vs-lineare-suche-in-java","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=4045","title":{"rendered":"Algorithmen und Datenstrukutren: Bin\u00e4re Suche vs. lineare Suche in JAVA"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Der Algorithmus<\/h2>\n\n\n\n<p>Die bin\u00e4re Suche funktioniert nur auf einem bereits sortiertem Datenbestand, daher wird die Zeit f\u00fcr das Sortieren des Arrays \u201emyArray\u201c mit Merge-Sort auf die Such-Zeit addiert. Da die 11 Elemente im Beispiel-Array sehr wenige sind, sind die Zeiten in ms wenig repr\u00e4sentativ.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage AlgoDat;\n \npublic class SearchAlgorithm {\n    \/\/ Zu durchsuchendes Array\n    private int myArray&#x5B;] = {22, 6, 2, 4, 10, 3, 9, 7, 5, 8, 1};\n     \n    \/\/ H\u00e4lt die Klasse als instanziertes Objekt\n    @SuppressWarnings(&quot;unused&quot;)\n    private static SearchAlgorithm program;\n \n    public int linearSearch(int&#x5B;] array, int contentToSearchFor)\n    {\n        for (int i = 0; i &lt; array.length; i++)\n        {\n            if (array&#x5B;i] == contentToSearchFor)\n            {\n                return i;\n            }\n        }\n \n        return -1;\n    }\n \n    public int binarySearch(int&#x5B;] myArray, int contentToSearchFor)\n    {\n        \/\/ Start conditions\n        int lowIndex = 0;\n        int highIndex = myArray.length - 1;\n \n        while (lowIndex &lt;= highIndex)\n        {\n            int middlePosition = (lowIndex + highIndex) \/ 2;\n            int middleContent = myArray&#x5B;middlePosition];\n \n            if (contentToSearchFor == middleContent) \n            {\n                return middlePosition;\n            }\n \n            \/\/ Halbieren der Suchelemente\n            if (contentToSearchFor &lt; middleContent)\n            {\n                highIndex = middlePosition - 1;\n            }\n            else\n            {\n                lowIndex = middlePosition + 1;\n            }\n        }\n \n        \/\/ Au\u00dferhalb der While-Schleife wissen wir, dass wir\n        \/\/ das Element nicht gefunden haben :-(\n        return -1;\n    }\n \n    \/\/ Konstruktor\n    public SearchAlgorithm()\n    {\n        int arrayContent = -1;\n        long startTime = 0;\n        long endTime = 0;\n        int index = -1;\n        long passedTime = 0;\n \n        System.out.println(&quot;Lineare Suche&quot;);\n        System.out.println(&quot;=============&quot;);\n        \/\/ Not found\n        arrayContent = 23;\n        startTime = System.nanoTime();\n        index = linearSearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; wurde nicht gefunden in myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = endTime - startTime;\n        System.out.println(&quot;Lineare Suche not found: &quot; + passedTime + &quot; ms.&quot;);\n         \n        \/\/ Best case\n        arrayContent = 22;\n        startTime =  System.nanoTime();\n        index = linearSearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = endTime - startTime;\n        System.out.println(&quot;Lineare Suche Best-Case: &quot; + passedTime + &quot; ms.&quot;);\n \n        \/\/ Average case\n        arrayContent = 3;\n        startTime =  System.nanoTime();\n        index = linearSearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = endTime - startTime;\n        System.out.println(&quot;Lineare Suche Average-Case: &quot; + passedTime + &quot; ms.&quot;);\n \n        \/\/ Worst case\n        arrayContent = 1;\n        startTime =  System.nanoTime();\n        index = linearSearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = endTime - startTime;\n        System.out.println(&quot;Lineare Suche Worst-Case: &quot; + passedTime + &quot; ms.&quot;);\n \n        System.out.println(&quot;Bin\u00e4re Suche&quot;);\n        System.out.println(&quot;============&quot;);\n \n        \/*********************************************\/\n        \/* die bin\u00e4re Suche ben\u00f6tigt ein sortiertes  *\/\n        \/* Array, damit sie funktioniert.            *\/\n        \/*********************************************\/\n        startTime = System.nanoTime();\n        this.mergeSort(myArray);\n        endTime =  System.nanoTime();\n        long passedSortTime = endTime - startTime;\n \n        \/\/ Not found\n        arrayContent = 23;\n        startTime = System.nanoTime();\n        index = binarySearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; wurde nicht gefunden in myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = passedSortTime + (endTime - startTime);\n        System.out.println(&quot;Bin\u00e4re Suche not found: &quot; + passedTime + &quot; ms.&quot;);\n         \n        \/\/ Best case\n        arrayContent = 22;\n        startTime =  System.nanoTime();\n        index = binarySearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = passedSortTime + (endTime - startTime);\n        System.out.println(&quot;Bin\u00e4re Suche erstes Element: &quot; + passedTime + &quot; ms.&quot;);\n \n        \/\/ Average case\n        arrayContent = 3;\n        startTime =  System.nanoTime();\n        index = binarySearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = passedSortTime + (endTime - startTime);\n        System.out.println(&quot;Bin\u00e4re Suche mittleres Element: &quot; + passedTime + &quot; ms.&quot;);\n \n        \/\/ Worst case\n        arrayContent = 1;\n        startTime =  System.nanoTime();\n        index = binarySearch(myArray, arrayContent);\n        System.out.print(&quot;Der Array-Element mit dem Inhalt &#039;&quot; + arrayContent + &quot;&#039; befindet sich am Index &quot; + index + &quot; von myArray&#x5B;]. &quot;);\n        endTime =  System.nanoTime();\n        passedTime = passedSortTime + (endTime - startTime);\n        System.out.println(&quot;Bin\u00e4re Suche letztes Element: &quot; + passedTime + &quot; ms.&quot;);\n    }\n \n    public static void main(String&#x5B;] args) \n    {\n        \/\/ Instanziere aus den statischem Programm ein echtes Objekt\n        \/\/ damit nicht alle Methoden und Variablen static sein m\u00fcssen.\n        program = new SearchAlgorithm();\n    }\n \n    \/**************\/\n    \/* MERGE SORT *\/\n    \/**************\/\n \n    public void mergeSort(int myArray&#x5B;])\n    {\n        \/\/ Abbruchbedingung der Rekursion im Sinne von Teile-und-Herrsche-Algorithmen\n        if (myArray.length == 1) return;\n \n        \/\/ weist bei ungeraden Zahlen eine abgerundete Ganzzahl zu\n        int indexHaelfte = myArray.length \/ 2;\n \n        int&#x5B;] linkeHaelfte = new int&#x5B;indexHaelfte];\n \n        \/\/ Die abgerundete Ganzzahl kann von der L\u00e4nge abgezogen werden\n        \/\/ um die Gr\u00f6\u00dfe des rechten Arrays zu erhalten.\n        int&#x5B;] rechteHaelfte = new int&#x5B;myArray.length - indexHaelfte];\n \n        \/\/ Bef\u00fclle die linke H\u00e4lfte \n        for (int i = 0; i &lt; indexHaelfte; i++)\n        {\n            linkeHaelfte&#x5B;i] = myArray&#x5B;i];\n        }\n \n        \/\/ Bef\u00fclle die rechte H\u00e4lfte \n        for (int i = indexHaelfte; i &lt; myArray.length; i++)\n        {\n            rechteHaelfte&#x5B;i - indexHaelfte] = myArray&#x5B;i];\n        }\n \n        \/\/ Hier ist der rekursive Aufruf, indem die beiden H\u00e4lften an\n        \/\/ die mergeSort-Methode selbst \u00fcbergeben wird.\n        this.mergeSort(linkeHaelfte);\n        this.mergeSort(rechteHaelfte);\n \n        \/\/ Hier werden die beiden Arrays wieder kombiniert (geMerged)\n        this.merge(myArray, linkeHaelfte, rechteHaelfte);\n    }\n \n    private void merge(int&#x5B;] mergeArray, int&#x5B;] linkeHaelfte, int&#x5B;] rechteHaelfte)\n    {\n        int iteratorLinks = 0, iteratorRechts = 0, iteratorMergeArray = 0;\n \n        \/\/ Da die linke und reche H\u00e4lfte bereits sortiert sind, funktioniert die Zuweisung\n        \/\/ in ein neues Array mit einer einzigen Schleife der Komplexit\u00e4t\/Ordnung O(n).\n        while (iteratorLinks &lt; linkeHaelfte.length &amp;&amp; iteratorRechts &lt; rechteHaelfte.length)\n        {\n            if (linkeHaelfte&#x5B;iteratorLinks] &lt;= rechteHaelfte&#x5B;iteratorRechts])\n            {\n                mergeArray&#x5B;iteratorMergeArray] = linkeHaelfte&#x5B;iteratorLinks];\n                iteratorLinks++;\n            }\n            else\n            {\n                mergeArray&#x5B;iteratorMergeArray] = rechteHaelfte&#x5B;iteratorRechts];\n                iteratorRechts++;\n            }\n \n            iteratorMergeArray++;\n        }\n \n        \/\/ Wenn noch Elemente in der linken H\u00e4lfte waren, die nicht verglichen wurden,\n        \/\/ werden diese dem Merged Array hinzugef\u00fcgt\n        while (iteratorLinks &lt; linkeHaelfte.length)\n        {\n            mergeArray&#x5B;iteratorMergeArray] = linkeHaelfte&#x5B;iteratorLinks];\n            iteratorLinks++;\n            iteratorMergeArray++;\n        }\n \n        \/\/ Wenn noch Elemente in der rechten Array-H\u00e4lfte waren, die nicht verglichen wurden,\n        \/\/ werden diese dem Merged Array hinzugef\u00fcgt\n        while (iteratorRechts &lt; rechteHaelfte.length)\n        {\n            mergeArray&#x5B;iteratorMergeArray] = rechteHaelfte&#x5B;iteratorRechts];\n            iteratorRechts++;\n            iteratorMergeArray++;\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Ausgabe<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nLineare Suche\n=============\nDer Array-Element mit dem Inhalt &#039;23&#039; wurde nicht gefunden in myArray&#x5B;]. Lineare Suche not found: 20969800 ms.\nDer Array-Element mit dem Inhalt &#039;22&#039; befindet sich am Index 0 von myArray&#x5B;]. Lineare Suche Best-Case: 9613200 ms.\nDer Array-Element mit dem Inhalt &#039;3&#039; befindet sich am Index 5 von myArray&#x5B;]. Lineare Suche Average-Case: 337400 ms.\nDer Array-Element mit dem Inhalt &#039;1&#039; befindet sich am Index 10 von myArray&#x5B;]. Lineare Suche Worst-Case: 270200 ms.\n \nBin\u00e4re Suche\n============\nDer Array-Element mit dem Inhalt &#039;23&#039; wurde nicht gefunden in myArray&#x5B;]. Bin\u00e4re Suche not found: 206800 ms.\nDer Array-Element mit dem Inhalt &#039;22&#039; befindet sich am Index 10 von myArray&#x5B;]. Bin\u00e4re Suche erstes Element: 271400 ms.\nDer Array-Element mit dem Inhalt &#039;3&#039; befindet sich am Index 2 von myArray&#x5B;]. Bin\u00e4re Suche mittleres Element: 306700 ms.\nDer Array-Element mit dem Inhalt &#039;1&#039; befindet sich am Index 0 von myArray&#x5B;]. Bin\u00e4re Suche letztes Element: 302800 ms.\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Komplexit\u00e4t: O-Notation (Ordnung)<\/h2>\n\n\n\n<p>Die Komplexit\u00e4t der bin\u00e4ren Suche wird mit<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"92\" height=\"21\" data-attachment-id=\"4046\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=4046\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-2.png?fit=92%2C21&amp;ssl=1\" data-orig-size=\"92,21\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-2.png?fit=92%2C21&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-2.png?resize=92%2C21&#038;ssl=1\" alt=\"\" class=\"wp-image-4046\"\/><\/a><\/figure>\n\n\n\n<p>beschrieben, wobei die Komplexit\u00e4t des vorangegangenen Merge-Sort-Algorithmus mitgerechnet werden muss, da die bin\u00e4re Suche nur auf einem bin\u00e4ren Datenbestand funktioniert. Somit ergibt sich<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-3.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"210\" height=\"21\" data-attachment-id=\"4047\" data-permalink=\"https:\/\/www.capri-soft.de\/blog\/?attachment_id=4047\" data-orig-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-3.png?fit=210%2C21&amp;ssl=1\" data-orig-size=\"210,21\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-3.png?fit=210%2C21&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.capri-soft.de\/blog\/wp-content\/uploads\/2024\/09\/image-3.png?resize=210%2C21&#038;ssl=1\" alt=\"\" class=\"wp-image-4047\"\/><\/a><\/figure>\n\n\n\n<p>, wobei die additiven Bestandteile\u00a0<em><strong>log(n)<\/strong><\/em>\u00a0wegfallen. Somit ergibt sich im vorliegenden Falle die Komplexit\u00e4t<em><strong>\u00a0O(n*log(n))<\/strong><\/em>\u00a0wegen der vorangegangen Sortierung. Ist diese nicht notwendig bleibt es bei der O-Notation\u00a0<strong><em>O(log(n)).<\/em><\/strong><\/p>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D4045&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Der Algorithmus Die bin\u00e4re Suche funktioniert nur auf einem bereits sortiertem Datenbestand, daher wird die Zeit f\u00fcr das Sortieren des Arrays \u201emyArray\u201c mit Merge-Sort auf die Such-Zeit addiert. Da die 11 Elemente im Beispiel-Array sehr wenige sind, sind die Zeiten in ms wenig repr\u00e4sentativ. Ausgabe Komplexit\u00e4t: O-Notation (Ordnung) Die Komplexit\u00e4t der bin\u00e4ren Suche wird mit &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=4045\" class=\"more-link\"><span class=\"screen-reader-text\">Algorithmen und Datenstrukutren: Bin\u00e4re Suche vs. lineare Suche in JAVA<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[475,15,3],"tags":[482,484,485,476,486,487,483],"class_list":["post-4045","post","type-post","status-publish","format-standard","hentry","category-algorithmen-und-datenstrukturen","category-java","category-programmierung","tag-binaere","tag-binaere-suche","tag-binary-search","tag-komplexitaet","tag-linear-search","tag-o-notation","tag-suche"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-13f","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4045"}],"version-history":[{"count":1,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4045\/revisions"}],"predecessor-version":[{"id":4048,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4045\/revisions\/4048"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}