160 likes | 334 Views
אלגוריתמי חיפוש. Brute Force. Module Module1 Function BruteForce ( ByRef x() As Integer , ByRef item As Integer ) As Integer Dim i As Integer For i = 0 To x.Length () - 1 If (x( i ) = item) Then Return i End If Next Return -1 'Not found! End Function Sub Main()
E N D
Brute Force ModuleModule1 FunctionBruteForce(ByRef x() AsInteger, ByRef item AsInteger) AsInteger DimiAsInteger Fori = 0 Tox.Length() - 1 If (x(i) = item) Then Returni EndIf Next Return -1 'Not found! EndFunction SubMain() Dim numbers() AsInteger = {1, 2, 3, 4, 10, 10, 71, 101} Dim key AsInteger key = Console.ReadLine() Console.WriteLine(BruteForce(numbers, key)) EndSub EndModule
BubbleSearch Sub Swap(ByRef x AsInteger, ByRef y AsInteger) Dim temp AsInteger = x x = y y = temp EndSub FunctionBubbleSearch(ByRef x() AsInteger, ByRef item AsInteger) AsInteger DimiAsInteger Fori = 0 Tox.Length() - 1 If (x(i) = item) Then Ifi > 0 Then Swap(x(i), x(i - 1)) EndIf Returni EndIf Next Return -1 'Not found! EndFunction SubMain() Dim numbers() AsInteger = {1, 2, 3, 4, 10, 10, 71, 101} Dim key AsInteger key = Console.ReadLine() Console.WriteLine(BubbleSearch(numbers, key)) Console.WriteLine(BubbleSearch(numbers, key)) EndSub
? 12 חיפושבינרי 2 5 8 11 23 24 28 34 38 41 44 45 52 60 70 מבוא למדעי המחשב - מאיר קומר - סמסטר א'- תשס"ט - שיעור מספר 7
חיפושבינארי אבל איך יודעים אם מצאתי? יופי, אבל איפה? FunctionBinarySearch(ByRef x() AsInteger, ByRef item AsInteger) AsInteger Dim Mid AsInteger Dim low AsInteger = 0 Dim high AsInteger = x.Length() - 1 While (low <= high) Console.WriteLine("high is " & high) Console.WriteLine("low is " & low) Mid = (low + high) \ 2 If (item = x(Mid)) Then Console.WriteLine("I found it!!") Return Mid 'Found here! ElseIf item > x(Mid) Then low = Mid + 1 Else high = Mid - 1 EndIf EndWhile Return -1 'Not found! EndFunction מבוא למדעי המחשב - מאיר קומר - סמסטר א'- תשס"ט - שיעור מספר 7
Main דוגמא של Sub Main() Dim numbers() AsInteger = {1, 2, 3, 4, 10, 10, 71, 101} Dim key AsInteger key = Console.ReadLine() Console.WriteLine(BinarySearch(numbers, key)) EndSub
חיפושבינארי רקורסיבי SubRBinarySearch(ByRef x() AsInteger, ByRef item AsInteger, ByVal low AsInteger, ByVal high AsInteger) Dim Mid AsInteger If (low > high) Then Console.WriteLine("Item not found") Else Mid = (low + high) / 2 If item > x(Mid) Then RBinarySearch(x, item, Mid + 1, high) ElseIf item < x(Mid) Then RBinarySearch(x, item, low, Mid - 1) Else Console.WriteLine("I found it in position " & Mid) EndIf EndIf EndSub
Main דוגמא של Sub Main() Dim numbers() AsInteger = {1, 2, 3, 4, 10, 10, 71, 101} Dim key AsInteger key = Console.ReadLine() RBinarySearch(numbers, key, 0, numbers.Length() - 1) EndSub
עץ בינרי מלא שורש 8 4 12 6 15 2 10 5 7 1 3 14 16 9 11 עלים
עץ בינרי חלקי 8 4 12 6 15 2 7 1 14 16
חיפוש בעץ בינרי • האם הערך X נמצא בעץ? • נתחיל מהשורש של העץ • בכל קדקוד נחליט אם לפנות ימינה או שמאלה • אם X שווה לקדקוד הנוכחי • מצאנו! • אחרת אם הקדקוד הנוכחי אינו עלה • אם X גדול מערך הקדקוד • נפנה ימינה • אם X קטן מערך הקדקוד • נפנה שמאלה • אם הגענו לעלה שאינו שווה לX • X לא קיים בעץ
התאמת התבנית ימין לשמאל • ההתאמה מתבצעת מסוף המילה לכיוון ההתחלה • (כמו עברית) • עבור תבנית: • abc: ↓ T:bbacdcbaabcddcdaddaaabcbcb P:abc • במקרה הגרוע עדיין דורש m*n השוואות
Boyer-Moore Example T: P:
חיפוש פשוט לטקסטים ModuleModule1 Sub Main() Dim t AsString = "my name is avi, not aviya, or aviva, avihu, aviv or david!" Console.WriteLine(t.IndexOf("avi")) Console.WriteLine(t.LastIndexOf("avi")) EndSub EndModule
חיפוש מחוכם לטקסטיםב VB ImportsSystem.Text.RegularExpressions ModuleModule1 Sub Main() DimmyMatchesAsMatchCollection Dim t AsString = "my name is avi, not aviya, or aviva, avihu, aviv or david!" DimmyRegexAsNewRegex("avi") myMatches = myRegex.Matches(t) DimsuccessfulMatchAsMatch ForEachsuccessfulMatchInmyMatches Console.WriteLine(successfulMatch.Index) Next EndSub EndModule