binäre Suche im 2 dim Feld

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • binäre Suche im 2 dim Feld

    Hey,

    habe mir gerade überlegt, wie man mit Pascal (in der Delphikonsole) ein Unterprogramm schreiben könnte, was eine binäre Suche in einem 2 dimensionalen Feld durchführt...vielleicht können die programmiererfahrernen Forumsteilnehmer mal ein Auge darauf werfen, um ihre Meinung kundzutun in Form von Verbesserungsvorschlägen,Kritiken etc.

    Das 2D-Feld ist zeilweise und spaltenweise aufsteigend sortiert...in meinen Tests hats funktioniert, wenn das nur dumme Zufälle waren (und das jmd. auf Anhieb sieht), wäre es nett wenn ich auf die Fälle hingeweisen werden könnte...

    Quellcode

    1. program Suche_2D;
    2. {$APPTYPE CONSOLE}
    3. uses
    4. SysUtils;
    5. const n=3;
    6. m=3;
    7. type Matrix=array[1..n,1..m] of integer;
    8. ergebnis=array[1..2] of integer;
    9. function binsearch_dim2 (Folge: Matrix; n,m:integer;key:byte):ergebnis;
    10. var i,mitte_spalte,links,rechts,Zeile:integer;
    11. gefunden,Fehler:boolean;
    12. merke:array of boolean;
    13. begin
    14. Setlength(merke,n);
    15. gefunden := false;
    16. Fehler:=false;
    17. Zeile:= n div 2;
    18. rechts:= m;
    19. links := 1;
    20. for i:=1 to n do merke[i]:=false;
    21. while not gefunden and not Fehler do
    22. begin
    23. merke[Zeile]:=true;
    24. while (links <= rechts) and not gefunden do
    25. begin
    26. mitte_spalte:= (rechts + links) div 2;
    27. if Folge[zeile,mitte_spalte] > key then rechts:=mitte_spalte-1
    28. else if Folge[Zeile,mitte_spalte] = key then gefunden:=true
    29. else links:=mitte_spalte+1;
    30. end;
    31. if not gefunden and (links = 1) then
    32. begin
    33. Dec(Zeile);
    34. if (merke[Zeile] <> true) and (Zeile >= 1) then rechts:=m
    35. else Fehler:=true;
    36. end
    37. else if not gefunden and (rechts = m) then
    38. begin
    39. Inc(Zeile);
    40. if (merke[Zeile] <> true) and (Zeile <= n) then links:=1
    41. else Fehler:=true;
    42. end;
    43. end;
    44. merke:=nil;
    45. if not Fehler and gefunden then
    46. begin
    47. result[1]:=Zeile;
    48. result[2]:=mitte_spalte;
    49. end
    50. else result[1]:=0;
    51. end;
    52. var a:Matrix;
    53. begin
    54. //Test
    55. a[1,1]:=1;
    56. a[1,2]:=2;
    57. a[1,3]:=3;
    58. a[2,1]:=4;
    59. a[2,2]:=5;
    60. a[2,3]:=6;
    61. a[3,1]:=7;
    62. a[3,2]:=8;
    63. a[3,3]:=9;
    64. write(binsearch_dim2(a,n,m,8 )[1],' ',binsearch_dim2(a,n,m,8 )[2]);
    65. readln;
    66. end.
    Alles anzeigen


    Gruß Slash
  • Verbesserte Version des binsearch Algorithmus

    Habe außerdem Problem mit den Typen in der Parameterliste noch ein anderes Problem gefunden...desweiteren habe ich den Code selbst noch optimiert und mit Kommentaren versehen...Vielleicht ist es jetzt bequemer, mal ein Auge trüber zu werfen...

    Quellcode

    1. const n=3;
    2. m=3;
    3. type Matrix=array[1..n,1..m] of integer;
    4. ergebnis=array[1..2] of integer;
    5. function binsearch_dim2 (Folge: Matrix; n,m:integer;key:integer):ergebnis;
    6. var mitte_spalte: integer;
    7. links: integer;
    8. rechts: integer;
    9. zeile_o: integer;
    10. zeile_u: integer;
    11. zeilen_mitte: integer;
    12. gefunden: boolean;
    13. begin
    14. gefunden := false;
    15. //Variablenindizies fuer eine Zeile (nord/süd)
    16. zeile_o:=1;
    17. zeile_u:=n;
    18. zeilen_mitte:= (n+m) div 2;
    19. //Variablenindizies fuer eine Zeile (west/ost) in der Matrix
    20. rechts:= m;
    21. links := 1;
    22. //Schleife die im Worst Case gesamte Matrix absucht bis gefunden:=true oder unten = oben
    23. repeat
    24. //bineare Suche in den jeweiligen Zeilen der Matrix
    25. while (links <= rechts) and not gefunden do
    26. begin
    27. mitte_spalte:= (rechts + links) div 2;
    28. if Folge[zeilen_mitte,mitte_spalte] > key then
    29. rechts:=mitte_spalte-1
    30. else if Folge[zeilen_mitte,mitte_spalte] = key then
    31. gefunden:=true
    32. else links:=mitte_spalte+1;
    33. end;
    34. if not gefunden then
    35. begin
    36. if links = 1 then
    37. begin
    38. zeile_u:=zeilen_mitte-1;
    39. rechts:=m;
    40. end
    41. else if rechts = m then
    42. begin
    43. zeile_o:=zeilen_mitte+1;
    44. links:=1;
    45. end;
    46. end;
    47. until gefunden or (zeile_o >= zeile_u);
    48. if gefunden then
    49. begin
    50. result[1]:=zeilen_mitte;
    51. result[2]:=mitte_spalte;
    52. end
    53. else result[1]:=0;
    54. end;//Funktionsende
    55. var a:Matrix;
    56. begin
    57. //Test
    58. a[1,1]:=1;
    59. a[1,2]:=2;
    60. a[1,3]:=3;
    61. a[2,1]:=4;
    62. a[2,2]:=5;
    63. a[2,3]:=6;
    64. a[3,1]:=7;
    65. a[3,2]:=8;
    66. a[3,3]:=9;
    67. write(binsearch_dim2(a,n,m, 8 )[1],' ',binsearch_dim2(a,n,m, 8 [2]);
    68. readln;
    69. end.
    70. //Ausgabe ist: 2 3
    Alles anzeigen


    ----------------------------------------------------------------
    Edit:
    Bitte das Syntax Highlighting unter dem Editor beachten.