2017-12-28 24 views
1

Was ich brauche, ist nach Phrasen aus Array eins in Array zwei suchen, die Wörter enthält. Sagen wir "Array" enthält ["Margaret ist ein Mädchen"; "Liebt"; "Kartoffel"; "Swim"], und ein anderer ist ein zufälliger Text von Wörtern, der in Array gespuckt wird. Wie effizient nach Phrasen (einer Wortfolge) und nur nach Wörtern suchen? Weil es altmodisch ist, wird Timing-Problem sein, wie ich denke.Wie effizient nach bestimmten Phrasen in Array von Wörtern suchen?

+5

Was haben Sie ausprobiert und womit kämpfen Sie gerade? –

+0

Ich habe versucht, dieses Problem mit FOR-Schleife zu sortieren, und gehe durch das gleiche Array viele Male ... Und ich möchte es verbessern, benötigte Zeit zu verkürzen –

+0

Ihr Problem ist nicht trivial und erfordert eine nicht-triviale Lösung, wenn Sie brauchen optimale Leistung. Die Suche nach großen Texten für mehrere Strings kann effizient mit [Präfixbäumen] (https://en.wikipedia.org/wiki/Trie) (aka * tries *) implementiert werden. –

Antwort

2

Wenn Sie die __.exists oder __.forall Funktionen, die sie so lange kurzzuschließen werden als (Nicht-) passendes Ergebnis gefunden wird, die etwa so effizient wie ein for-Schleife wird:

let arr1 = [| "Margaret is a girl"; "Loves";"Potato"; "Swim" |] 
let arr2 = [| "Margaret"; "is"; "a"; "girl" |] 

let ``can be built from`` words phrase = 
    phrase 
    |> String.split ' ' 
    |> Array.forall (fun word -> words |> Array.contains word) 

let buildablePhrases = arr1 |> Array.filter (``can be built from`` arr2) 

Wenn die Arrays riesig und der oben genannte Code ist immer noch zu langsam, ich denke, Sie müssen mit der Einführung von Optimierungen beginnen - Dubletten entfernen, häufigste Suchen zwischenspeichern usw. Welche Optimierungen sinnvoll sind, hängt von den Daten ab, mit denen Sie zu tun haben.

+0

Danke, ich werde versuchen, Ihre Gedanken in meinen Code zu implementieren! –

Verwandte Themen