Binäre Suchmethode (binäre Suchmethode)

Binäre Suche

1. Der Vorteil ist, dass die Anzahl der Vergleiche relativ gering ist und die Anzahl, die Sie finden möchten, schnell gefunden werden kann, was weniger Zeit in Anspruch nimmt.
2. Der Nachteil ist, dass bei dieser Methode die nachzuschlagende Tabelle geordnet sein muss und das Einfügen und Löschen schwierig ist.

1. Verwenden Sie ein eindimensionales Array als Beispiel:

Beispiel: Ein eindimensionales Array a [10] = {2,5,7,8,9,15,20); finden Sie die Position von key = 15 in diesem Array. (Da es sich um ein Beispiel handelt, ist dieses Array geordnet. Wenn Sie auf ein ungeordnetes Array stoßen, können Sie es zuerst sortieren. Bei der Art von Kung Fu wird jedoch geschätzt, dass es nach dem Durchlaufen gefunden wird. Es wird daher nicht empfohlen, in der Reihenfolge zu sein. Wenn Sie es verwenden, ist es zeitaufwändiger.) Zeichnen Sie, Fügen Sie hier eine Bildbeschreibung ein
wie in der Abbildung gezeigt, die kleinsten Daten als niedrig, die größten Daten als hoch und den Mittelwert als mittel auf (wenn mid keine Ganzzahl ist, muss sie gerundet werden),
verwenden Sie zwei Punkte Vergleichen Sie bei der Suche nach Methoden zuerst den Wert des zu durchsuchenden Schlüssels mit mid. In diesem Beispiel werden beispielsweise 8 und 15 verglichen, 8 ist kleiner als 15, sodass der Bereich auf [8, 20] reduziert wird. Innerhalb des Intervalls. Verwenden Sie dann in diesem Intervall weiterhin die oben beschriebene Methode:
c Der Sprachcode lautet wie folgt:

#include<stdio.h>
int search(int a[],int n,int key)
{
   int low=0;
   int high=n-1,mid;
   while(low<=high)
   {
      mid=(low+high)/2;
      if(key==a[mid]);
      	return mid;
      if(key>a[mid])
      		low=mid+1;
      	else high=mid-1;
   }
return -1;
}

int main()
{
   int a[]={2,5,7,8,9,15,20};
   printf("%d",search(a,7,15));
   return 0;
}

2. Verwenden Sie ein zweidimensionales Array, um in zwei Hälften zu suchen.

Da ein zweistelliges Array für die Suche verwendet wird, bedeutet dies, dass jede Zeile und Spalte des zweidimensionalen Arrays geordnet ist.
Beispiel: Es gibt ein zweistelliges 3 * 5-Array. Jede Zeile und jede Spalte davon wird inkrementiert, wie in der Abbildung gezeigt. Fügen Sie hier eine Bildbeschreibung ein
Da jede Zeile inkrementiert ist, verwenden wir zunächst die Zahl 9 in der oberen rechten Ecke als Benchmark, die wir finden müssen Vergleicht die Zahl mit der Zahl 9, wenn sie größer als 9 ist, bleibt die Spalte der Zahl 9 unverändert, und die Anzahl der Zeilen wird um eins erhöht, was einem Sprung zur Zahl 12 entspricht. Vergleichen Sie dann die zu findende Zahl mit der Zahl 12, wenn sie kleiner als 12 ist Dann bleibt die Anzahl der Zeilen der Zahl 12 unverändert, die Anzahl der Spalten -1. Wiederholen Sie dann den obigen Vorgang, den Sie finden können.

Hinweis: Die Bedingungen für das Ende der Schleife: 1 bestehen darin, die gewünschte Nummer zu finden und zu beenden. 2 wird nicht gefunden, beendet, es gibt zwei Möglichkeiten, wenn die Anzahl nicht gefunden wird, die Anzahl der Zeilen erhöht wurde, die Array-Grenze überschritten wurde oder die Anzahl der Spalten verringert wurde, die Grenze überschritten wurde.
Der vollständige Code lautet wie folgt:

#include<stdio.h>
int main()
{
  int n,m,key,i,j;
  int a[10][10];
  scanf("%d %d",&n,&m);
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      scanf("%d",&a[i][j]);
  scanf("%d",&key);
  i=1;j=m;   //将与key作比较的点选为右上角
  while(i<=n&&j>=1)
  {
    if(a[i][j]==key)
    {
      printf("%d %d",i,j);
      return 0;
    }
    if(a[i][j]<key)
        i++;
    else  j--;
  }
  printf("-1");    //找不到则输出-1
  return 0;
  }
Veröffentlicht 10 Originalartikel · Likes2 · Besuche 217

Ich denke du magst

Origin blog.csdn.net/dfwef24t5/article/details/104140669
Empfohlen
Rangfolge