Notes de cours: techniques de recherche pour les tableaux linéaires

Recherche séquentielle : méthode de recherche séquentielle ordinaire, méthode de recherche séquentielle avec sifflet de surveillance
Demi-recherche : arbre de décision pour la demi-recherche

#include  
using namespace std; 
const int MaxSize = 100; 
class LineSearch{ 
public:     
	LineSearch(int a[], int n);
	~LineSearch() {}
	int SeqSearch(int k);
	int BinSearch1(int k);
	int BinSearch2(int low, int high, int k);
private:     
	int data[MaxSize];
	int length;
};
LineSearch :: LineSearch(int a[ ], int n){     
	for (int i = 0; i < n; i++)         
		data[i+1] = a[i];
	length = n; 
}

L'
idée de base de la recherche séquentielle (recherche linéaire) : comparer les codes clés avec la valeur donnée un par un d'une extrémité du tableau linéaire à l'autre extrémité. S'ils sont égaux, la recherche réussit et la position de l'enregistrement dans le tableau est donnée; si le tableau entier est testé Si le code clé égal à la valeur donnée n'est toujours pas trouvé, la recherche échoue et un message d'échec s'affiche.

int LineSearch :: SeqSearch(int k) 
{         
	i=n;      
	while (i>0 && data[i]!=k)          
		i--;      
	return i; 
}

L'
idée de base d' une recherche de séquence améliorée : configurer "Sentinel". La sentinelle est la valeur à vérifier. Placer la sentinelle à la fin de la direction de recherche élimine le besoin de juger si la position de recherche franchit la frontière après chaque comparaison dans le processus de recherche, augmentant ainsi la vitesse de recherche.

int LineSearch :: SeqSearch(int k) 
{      
	int i = length;
	data[0] = k;
	while (data[i] != k)
		i--;     
	return i;  
}

Méthode d'amélioration de la recherche séquentielle et des performances de recherche
Enregistrez la fréquence d'accès de chaque donnée et déplacez les données avec une fréquence d'accès élevée vers la droite de la table de séquence, ce qui peut réduire le nombre de comparaisons effectuées lorsque la recherche est réussie, améliorer l'efficacité de la
construction d'une table de séquence ordonnée et réduire la recherche le nombre de comparaisons effectuées n'améliorer l' efficacité de la recherche
afin de trouver une liste unique

int LinkSearch::SeqSearch2(Node *first, int k){    
	Node *p;  
	int count=0;
	p=first->next;   
	int j=1;
	while (p &&  p->data != k)  
	{
		p=p->next; 
		j++;    
		count++;
	}  
	if (!p){              
		cout<<"查找失败,比较的次数为:"<<count<<endl;                
		return 0;      
	} 
	else{      
		cout<<"\n"<<"查找成功,比较的次数为:"<<count<<endl;              
		return j;  
	} 
}

Les avantages de la recherche séquentielle : l'
algorithme est simple et largement utilisé.
Il n'y a aucune exigence quant à la structure de stockage des enregistrements dans la table, que ce soit le stockage séquentiel ou le stockage lié;
il n'y a aucune exigence quant à l'ordre des enregistrements dans la table, que les enregistrements soient ou non classés par clé.
Inconvénients de la recherche séquentielle : la
longueur de recherche moyenne est grande, surtout lorsqu'il y a de nombreux éléments dans l'ensemble à rechercher, l'efficacité de la recherche est faible.
Recherche binaire
Conditions applicables
: Les enregistrements de la table linéaire doivent être classés selon les codes clés, ils doivent être stockés dans l'ordre.
Idée de base :
dans une liste ordonnée (faible, élevée, faible <= élevée), prenez l'enregistrement intermédiaire comme objet de comparaison, si la valeur donnée est égale au code clé de l'enregistrement intermédiaire, la recherche réussit; si la valeur donnée est inférieure à l'enregistrement intermédiaire Le code clé est recherché dans la moitié gauche de l'enregistrement du milieu; si la valeur donnée est supérieure au code clé de l'enregistrement du milieu, la recherche se poursuit dans la moitié droite de l'enregistrement du milieu. Répétez le processus ci-dessus en continu jusqu'à ce que la recherche aboutisse ou que la zone recherchée ne contienne aucun enregistrement et que la recherche échoue.

int LineSearch :: BinSearch1(int k){      
	int mid, low = 1, high = length;
	while (low <= high) {
		mid = (low + high) / 2;            
		if (k < data[mid])                
			high = mid - 1;
		else if (k > data[mid])                 
			low = mid + 1;            
		else                
			return mid;
	}       
	return 0;
}
int LineSearch :: BinSearch2(int low, int high, int k){       
	if (low > high)            
		return 0;
	else {          
		int mid = (low + high) / 2;
		if (k < data[mid])             
			return BinSearch2(low, mid-1, k);       
		else if (k > data[mid])             
			return BinSearch2(mid+1, high, k);        
		else             
			return mid;
	} 
}

Détermination de l'arbre de recherche binaire
arbre de détermination : Le processus de recherche binaire peut être décrit par un arbre binaire, chaque noeud de l'arbre correspond à un enregistrement dans la liste ordonnée, la valeur de la position de noeud enregistrées dans la table. Cet arbre binaire décrivant le processus de recherche de demi-recherche est généralement appelé un arbre de décision de recherche de demi-recherche, ou arbre de décision pour faire court.
Méthode de construction de l'arbre de décision
⑴ Lorsque n = 0, l'arbre de recherche à demi-recherche est vide;
⑵ Lorsque n> 0, le nœud racine de l'arbre de recherche à demi-recherche est au milieu = (n + 1) / 2, à gauche du nœud racine Le sous-arbre est un arbre de décision à demi-recherche correspondant à la liste ordonnée r [1] ~ r [milieu-1], et le sous-arbre droit du nœud racine est un demi-moitié correspondant à r [milieu + 1] ~ r [n] Trouvez l'arbre de décision.
Les caractéristiques de l'arbre de décision
Deux arbres de recherche à demi-recherche, s'ils ont le même nombre de nœuds, leur structure est exactement la même
. La hauteur de l'arbre de recherche semi-fini à n nœuds est (log2n arrondi à +1).
la nature de l' arbre de décision du
nombre de noeuds dans les sous - arbres gauche et à droite d'un nœud différent jusqu'à une
hauteur d'un des noeuds de sous - arbre arbitraire diffèrent jusqu'à environ 1
tous les deux niveaux qui diffèrent au plus 1 feuilles
analyse des performances de recherche binaire
recherche est réussie : le Le processus de recherche d'un enregistrement dans la table est le chemin du nœud racine au nœud d'enregistrement dans l'arbre de décision de recherche binaire, et le nombre de comparaisons avec la valeur donnée est égal au nombre de couches du nœud d'enregistrement dans l'arbre.
Recherche infructueuse : le processus de recherche d'échec consiste à prendre un chemin du nœud racine au nœud externe, et le nombre de comparaisons de clés avec la valeur donnée est égal au nombre de nœuds internes sur le chemin (moyenne en cas d'échec) Trouvez la longueur égale à la hauteur de l'arbre).

A publié 48 articles originaux · Comme 25 · Visite 2453

Je suppose que tu aimes

Origine blog.csdn.net/qq_43628959/article/details/103358161
conseillé
Classement