Egy bináris keresési fa, mint a helyesírás-ellenőrző

szavazat
4

Barangolás a leginkább hatékonnyá módja annak, hogy egy bináris keresési fa egy helyesírás-ellenőrző elolvassa mondjuk 1000 szó szótárban fájlt, majd miután azt ellenőrizni egy másik dokumentumot, amely szerint van egy pár bekezdését.

A kérdést 05/12/2008 03:05
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
8

hármas fa Trie hatékonyabb lenne

Válaszolt 05/12/2008 03:22
a forrás felhasználó

szavazat
0

Ha kell tennie egy automatikus sugallják / prefix keresés is, akkor a Patricia fa vagy radix fa érdemes megnézni.

Válaszolt 05/12/2008 03:26
a forrás felhasználó

szavazat
0

A példát, amit adtál, a teljesítmény valószínűleg nem releváns, mivel a PC az egész művelet eltart körülbelül 1% -át az időt, mely a felhasználó számára, hogy olvassa el az első eredmény megmutatod, feltéve, ha nem használja a teljesen hülye algoritmus . De mégis, én vállalja a probléma elég nagy, hogy a teljesítmény kérdése.

Ha a szótár fájl presorted (ahogy a legtöbb), és ha a szöveg képest kicsi a szótárban, ahogy leírja, akkor azt kell alaposan a kísértés, hogy rendezze a szöveget, talán eltávolítja ismétli, majd végighaladni mindkét listán side-by -oldali ugyanezzel az eljárással, mint egy egyesítést sort, kivéve, ha jelenteni, hogy az egyes szöveg szó a szótárban helyett kimenetre egy összevont listában.

Ez teszi a dolgát kb M log M összehasonlítások a fajta, plusz legfeljebb N + M összehasonlítások a bejárást, (esetleg kisebb, de nem komplexitás-kevésbé). Ez meglehetősen közel optimális komplexitás egy egyszeri művelet: megszabadulni a lineáris kifejezés N meg kell találni a módját, hogy nem olvassa el az egész szótárt lemez egyáltalán. Biztos vagyok benne, hogy lehetséges, hogy bsearch a fájlba, különös tekintettel arra, hogy a szavak elég rövid, de a kis N ez találgatni, hogy keresek a hely valóban lesz gyorsabb, mint sorozatban az adatok.

Ez a következő tulajdonságokkal rendelkezik:

  • Nem kell, hogy tartsa a szótár memóriában, csak a szöveget.
  • Mindazonáltal, ha csak hogy egy átmennek a szótárban fájlt.
  • Nem csinál semmi drága feldolgozását a szótárban.

Természetesen, ha a szótár fájl nem előválogatva akkor ez nem működik, és ha tudja tartani a szótárban lógott a memóriában a következő helyesírás-ellenőrzés működését akkor amortizálja a költségek I / O és a feldolgozás be egy fa szerte több különböző szövegeket, melyik lesz a győzelem hosszú távon.

Ha a szótár tényleg hatalmas, akkor válhat a tárolás a lemez egy előre feldolgozott formában egyenértékű egy kiegyensúlyozatlan fa szerint súlyozott relatív gyakoriságát a különböző szavak az Ön nyelvén. Akkor meg tudod csinálni kevesebb, mint O (N) lemez hozzáférés a kis szöveget, és a legtöbb operációs nem zavarja, hogy betölti a memóriába egyáltalán, csak mmap a fájlt, és hagyja, hogy az operációs rendszer aggódj. Egy nagy szótár, az egész klaszter, amely szavakkal kezdődő „dimetil” sosem szükséges megérinteni.

Egy másik szempont az egy ferde fát a szótárban. A ferde fa megingatja magát megnézi a dolgokat benne, annak érdekében, hogy a leggyakrabban használt értékek gyorsabban megtalálni. A legtöbb szöveget használ egy kis szavak száma többször, így ha a szöveg elég hosszú, hogy igazolja az overhead ez fog nyerni végül.

Mindkét fenti vannak kitéve Steven A Lowe azon pontja, hogy a húrok, a Trie veri a szokásos fa. Nem tudom, hogy talál egy off-the-shelf ferde Trie, mégis.

Válaszolt 05/12/2008 03:55
a forrás felhasználó

szavazat
1

Ha csak akar látni, ha egy adott szó létezik a szótárban (azaz ez helyesen írta), akkor nem hiszem, hogy egy bináris keresési fa, amit után. Jobb ezen információk tárolásának lenne egy fa stílust, ahol az egymást követő csomópont a fa az egyik karakter, és az olvasás az utat a végső csomópont ad a helyesírás ezt a szót. Az ember azt is hozzá kell adnia egy jelölő jelzi a szó végét.

Pl: mondjuk a szótárban rendelkezik ezekkel a szavakkal: autó, kocsi, macska, csésze, vágott

- C
  - A
    - R
      - end
      - T
    - T
      - end
  - U
    - P
      - end
    - T
      - end

Ellenőrzése, ha a szó létezik, a kérdés az, látszó, mindegyik levél külön, és hogy létezik a gyermekek az aktuális csomópont.

Check for "cat"
Does "C" exist at the root level? Yes, move to the next letter.
Does "A" exist underneath C? Yes, move on.
Does "T" exist underneath A? Yes, move on.
Is there a word ending after the T? Yes. Word exists.

Check for "cu"
Does "C" exist at the root level? Yes, move to the next letter.
Does "U" exist at the root level? Yes, move to the next letter.
Is there a word ending after the U? No. Word does not exist.

Hogyan tároljuk az adatokat csak rajtad. Ahogy Steven rámutatott, ternáris Keresés Trie lehet az út: minden csomópont lenne 27 lehetséges gyermek csomópontok.

Válaszolt 05/12/2008 04:16
a forrás felhasználó

szavazat
3

Te halott-beállított egy bináris keresési fa? A Bloom szűrő valószínűleg hatékonyabb adatszerkezet.

Válaszolt 05/12/2008 04:34
a forrás felhasználó

szavazat
0

Látva, hogy ez egy házi kérdést fogom fel, hogy van, hogy egy sima régi bináris fa (nincs Piros-Fekete fák, AVL fák, radix fák, stb.) A válasz tehát az, hogy próbáljuk a fa kiegyensúlyozott, mint te építeni azt a szólistát. Az egyik megközelítés az, hogy véletlenszerű a lista előtt olvasata is, ez ad elfogadható eredményt. De lehet, hogy jobb eredményeket, ha ahhoz a bemeneti sorozat (ugyanazt összehasonlítás, mint amit a fa használ), akkor rekurzívan osztják fel a bemeneti visszatérő középpontját, amíg nincs elem marad. Az eredmény egy kiegyensúlyozott fa.

Azt felcsinált három különböző módon csinálja C #:

private static IEnumerable<T> BinaryTreeOrder<T>(IList<T> range, int first, int last)
{
  if (first > last)
  {
    yield break;
  }

  int mid = (first + last) / 2;
  yield return range[mid];
  foreach (var item in BinaryTreeOrder(range, first, mid - 1))
  {
    yield return item;
  }
  foreach (var item in BinaryTreeOrder(range, mid + 1, last))
  {
    yield return item;
  }    
}

private static void BinaryTreeOrder<T>(IList<T> range, int first, int last, 
                                       ref IList<T> outList)
{
  if (first > last)
  {
    return;
  }

  int mid = (first + last) / 2;
  outList.Add(range[mid]);
  BinaryTreeOrder(range, first, mid - 1, ref outList);
  BinaryTreeOrder(range, mid + 1, last, ref outList);
}

private static void BinaryTreeOrder<T>(IList<T> range, int first, int last, 
                                       ref BinaryTree<T> tree) where T : IComparable<T>
{
  if (first > last)
  {
    return;
  }

  int mid = (first + last) / 2;
  tree.Add(range[mid]);
  BinaryTreeOrder(range, first, mid - 1, ref tree);
  BinaryTreeOrder(range, mid + 1, last, ref tree);
}
Válaszolt 20/04/2011 21:27
a forrás felhasználó

szavazat
1

Ezt helyre kell segíteni azt a végrehajtás java.

Válaszolt 12/06/2011 04:07
a forrás felhasználó

szavazat
0

Amint azt a Trie hatékonyabb lenne, mint egy bináris fát, de akkor egy HashMap és a hash minden szó. Van egy kis szótár (1000 bejegyzést). Ahogy áthalad a dokumentumot, ellenőrizze, hogy a szavak a HashMap. Ha ők nem, a szó feltételezzük, hogy elgépelt.

Ez nem ad esetleges korrekció a hibásan írt szó. Csak azt mondja, igen vagy nem (helyes-e vagy sem).

Ha azt szeretnénk, helyesírási javaslatok helytelen szóval lehet kezdeni a szót a fájlt, majd generálni minden szó 1 szerkesztési távolság van, és az ehhez a gyermekek az eredeti szót. Így ha az épület egy grafikonon. Ide 2. szint mélyen a maximális sebesség vs pontossággal. Ha létrehoz egy szót csomóponton, amely szerepel a szótárban, akkor add meg a listát a lehetséges javaslatokat. A végén visszatér a lehetséges javaslatokat.

A jobb helyesírás ellenőrzését is próbálja felvenni a fonetikus megfelelő.

tenger yuh -> lásd yah

Ez a módszer (létrehozásának grafikonok húrok 1 szerkesztés-re) a „lassú”. De ez egy jó tudományos gyakorlat. Futásidejű jelentése O (n ^ ágak).

Ha érdekelt, itt van egy link az egyik én építettem magam (szórakoztató): https://github.com/eamocanu/spellcheck.graph

Néhány minta grafikonok: https://github.com/eamocanu/spellcheck.graph/tree/master/graph%20photos

Azt is hozzá egy UI komponens rá, amely generálja a grafikonok. Ez egy külső könyvtár.

Válaszolt 15/12/2011 22:26
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more