Heim Java javaLernprogramm Mit Java ein Element in einem unendlichen Array finden

Mit Java ein Element in einem unendlichen Array finden

Sep 11, 2024 pm 12:30 PM

Finding an Element in an Infinite Array Using Java

Problemstellung

Angesichts einer unendlichen Menge sortierter Ganzzahlen müssen wir den Index einer bestimmten Zielzahl finden. Das Array ist „unendlich“, was bedeutet, dass wir seine Größe nicht im Voraus bestimmen können, sodass wir nicht einfach eine herkömmliche binäre Suche direkt anwenden können.


Ansatzübersicht

  1. Beginnen Sie mit einem kleinen Bereich: Gehen Sie zunächst davon aus, dass das Element in einem kleinen Bereich liegt (z. B. zwischen den Indizes 0 und 1).

  2. Den Bereich dynamisch vergrößern: Wenn das Zielelement nicht im Anfangsbereich gefunden wird, verdoppeln wir die Größe des Bereichs, um weiter zu suchen. Dieses exponentielle Wachstum ermöglicht es uns, schnell den Bereich zu bestimmen, in dem sich das Ziel befinden könnte.

  3. Binäre Suche innerhalb des Bereichs: Sobald wir einen geeigneten Bereich ermittelt haben, der das Ziel enthält, wenden wir die binäre Suche an, um den Index des Ziels effizient zu finden.


Der Kodex

public class InfiniteArraySearch {
    public static void main(String[] args) {
        // Define the array (for demonstration purposes, treat this as infinite)
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};  
        int target = 6;

        // Call the function to find the target element
        int result = findElementInInfiniteArray(arr, target);
        System.out.println("Element found at index: " + result);
    }

    // Function to find the target in the infinite array
    static int findElementInInfiniteArray(int[] arr, int target) {
        // Start with a small range
        int start = 0;
        int end = 1;

        // Dynamically increase the range until the target is within bounds
        while (target > arr[end]) {
            int newStart = end + 1;  // Update start to one after the current end
            end = end + (end - start + 1) * 2;  // Double the range
            start = newStart;  // Move the start to newStart
        }

        // Perform binary search within the determined range
        return binarySearch(arr, target, start, end);
    }

    // Standard binary search implementation
    static int binarySearch(int[] arr, int target, int start, int end) {
        while (start <= end) {
            int mid = start + (end - start) / 2;

            if (target < arr[mid]) {
                end = mid - 1;  // Move the end to the left
            } else if (target > arr[mid]) {
                start = mid + 1;  // Move the start to the right
            } else {
                return mid;  // Element found
            }
        }
        return -1;  // Element not found
    }
}
Nach dem Login kopieren

Erläuterung des Kodex

1. Hauptfunktion

Die Hauptfunktion definiert ein Beispielarray arr und einen Zielwert 6. Der Einfachheit halber gehen wir hier davon aus, dass das Array endlich ist, aber konzeptionell behandeln wir es als unendlich. Die Hauptfunktion ruft dann findElementInInfiniteArray auf, um nach dem Ziel zu suchen, und gibt den Index aus, wenn er gefunden wird.

2. Bereichserweiterung (lineare Erweiterung des Suchbereichs)

In der findElementInInfiniteArray-Methode:

  • Wir gehen zunächst davon aus, dass das Element im Bereich [0, 1] liegt.
  • Wenn das Ziel größer als der Wert bei arr[end] ist, bedeutet dies, dass das Ziel nicht innerhalb des aktuellen Bereichs liegt. Also erweitern wir den Bereich exponentiell, indem wir ihn verdoppeln (Ende = Ende + (Ende – Anfang + 1) * 2). Dies ermöglicht es uns effektiv, in jeder Iteration mehr Bereiche abzudecken.

3. Binäre Suche

Sobald wir wissen, dass das Ziel zwischen Anfang und Ende liegen muss, führen wir eine standardmäßige binäre Suche durch. Die binäre Suche ist eine effiziente Möglichkeit, in sortierten Arrays zu suchen, da sie den Suchraum bei jedem Schritt um die Hälfte reduziert. Die wichtigsten Vergleiche sind:

  • Wenn das Ziel kleiner als das mittlere Element (arr[mid]) ist, durchsuchen Sie die linke Hälfte.
  • Wenn das Ziel größer ist, suchen Sie die rechte Hälfte.
  • Wenn das Ziel mit dem mittleren Element übereinstimmt, geben Sie seinen Index zurück.

4. Edge Cases

  • Wenn das Ziel kleiner als das kleinste Element im Array ist oder das Array das Ziel überhaupt nicht enthält, gibt der Algorithmus -1 zurück.

Zeitkomplexität

  1. Bereichserweiterung: Der Bereich verdoppelt sich mit jeder Iteration, sodass O(log N) Operationen erforderlich sind, um den richtigen Bereich zu finden, in dem das Ziel liegt.

  2. Binäre Suche: Sobald der Bereich gefunden wurde, wird die binäre Suche in O(log M) ausgeführt, wobei M die Größe des Bereichs ist.

Daher beträgt die Gesamtzeitkomplexität ungefähr O(log N + log M).

Das obige ist der detaillierte Inhalt vonMit Java ein Element in einem unendlichen Array finden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1654
14
PHP-Tutorial
1252
29
C#-Tutorial
1225
24
Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Apr 19, 2025 pm 11:36 PM

Wie erkennt die Redis -Caching -Lösung die Anforderungen der Produktranking -Liste? Während des Entwicklungsprozesses müssen wir uns häufig mit den Anforderungen der Ranglisten befassen, z. B. das Anzeigen eines ...

See all articles