Mit Java ein Element in einem unendlichen Array finden
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
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).
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.
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 } }
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
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.
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











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. ...

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 ...

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 ...

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 ...

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

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 ...

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 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 ...
