Zum Inhalt springen

Firmennamen suchen in linearer Zeit und mit konstantem Speicher


Moeki

Empfohlene Beiträge

Gegeben sei ein sequentielles File, in dem N≤10.000.000 Firmennamen mit je max. fünf Buchstaben gespeichert sind. Ich möchte einen Algrithmus entwerfen, der in linearer Zeit und mit konstantem Speicher einen nicht vorhandenen Firmennamen findet.

Zunächst lasse ich beginnend von der kleinsten Kombinationsmöglichkeit einen Firmennamen erstellen. Dann öffne ich das File und mache solange get(f), bis (1) das Ende des Files erreicht ist bzw. (2) der Firmenname gefunden wurde. Bei (1) habe ich einen nicht genutzten Firmennamen gefunden. Bei (2) muss ich den nächstmöglichen Firmennamen erstellen und das File erneut durchsuchen.

Konstant sollte das sein, weil am File nichts geändert wird. Aber doch nicht linear oder?

Gruß,

Moeki.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin mir nicht sicher, ob der konstante Speicher auf die Datei bezogen ist. Ich glaube eher der Speicherverbrauch des Programms ist gemeint. Wird das Programm so realisiert, daß immer nur 2 Firmennamen im Speicher liegen (der generierte und der zu vergleichende aus der Datei), dann ist der Speicherverbrauch konstant.

Ich denke auch, daß der beschriebene Algorithmus linearer Ordnung ist, da er ja für jeden neu generierten Namen nochmal die Datei durchackert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles, was die Daten in sortierter Form liefern kann, sei es ein Index oder ein sortierender Container, würde den Suchvorgang auf lineare Laufzeit verkürzen. Das Erstellen eines Index bzw. das Sortieren selbst ist aber O(n * log n). Wenn man den Index persistent halten kann oder die Daten sortiert wieder ablegt, hat man den Aufwand natürlich nur einmal.

@Moeki,

Dein Algorithmus ist nicht linear. Im Worst Case (nur ZZZZZ ist noch frei, und danach suchst du zuletzt) hast du quadratische Laufzeit. Wie wahrscheinlich dieser Worst Case ist, hängt aber davon ab, wie voll die Liste ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sowas habe ich mir auch schon gedacht, aber dann müsste ich die Firmennamen ja irgendwie in eine numerische, vergleichbare Skala übertragen? Oder wie sollte man sonst "Lücken" erkennen?

Für Buchstaben geht das sicher, aber nicht für Wörter?

Oder ich addiere jeweils die ord(Substring, 1(2,3,4,5)) der Wörter und vergleiche mit dem nächsten?

Dann weiß ich zwar, dass ne Lücke ist, aber keinen entsprechenden freien Namen.

Bezüglich Linked/Indexed Trie: Das ist doch nicht mehr mit konstantem Speicherbedarf verbunden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sowas habe ich mir auch schon gedacht, aber dann müsste ich die Firmennamen ja irgendwie in eine numerische, vergleichbare Skala übertragen?
Prinzipiell brauchst du nichts zu übertragen, der Name ist ein numerischer, vergleichbarer Wert. Die erlaubten Zeichen bilden die Ziffern, die Anzahl der erlaubten Zeichen ist die Basis der Darstellung.

Wenn du z.B. nur Großbuchstaben erlaubst, ist ein Name die Darstellung einer Zahl zur Basis 26. Du kannst ein A als 0 interpretieren, und ein Z als 25. Damit hätte AAAAA den Wert 0 und ZZZZZ den Wert 25 * 26^4 + 25 * 26^3 + 25*26^2 + 25*26 + 25 = 11.881.375.

Oder ich addiere jeweils die ord(Substring, 1(2,3,4,5)) der Wörter und vergleiche mit dem nächsten?
Einfaches Addieren reicht nicht. Das ist nicht eindeutig. Jede "Stelle" hat eine andere Wertigkeit, eben wie bei Zahlensystemen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...