當前位置:首頁 » 編程語言 » c語言哈希查找演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言哈希查找演算法

發布時間: 2022-01-13 03:55:47

『壹』 c語言課程設計:查找演算法設計

折半查找
#include <stdio.h>
#define N 51
void main(void)
{
int a[N];
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到數字,則值為1,否則為0
int loc=-1;//要查找的數在表列中的位置,如果loca=-1表示表列中沒有這個數;如果有這個數,則它的值為所在的位置

printf("你想在多少個數中進行折半查找,請輸入(1--50):");
scanf("%d",&n);

while(n<1 || n>50)
{
printf("你輸入的數不正確,請重新輸入。\n");
printf("你想在多少個數中進行折半查找,請輸入(1--50):");
scanf("%d",&n);
}

printf("請你輸入一個整數 a[1](需保證遞增有序):");
scanf("%d",&a[1]);

i=2;
while(i<=n) //輸入從小到大的表列
{
printf("請你輸入一個整數 a[%d](需保證遞增有序):",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你輸入的數不滿足要求,請重新輸入。\n");
}

//輸出表列
printf("\n輸出表列\n");
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");

printf("請你輸入要查找的數:");
scanf("%d",&num);

flag=1; //假設輸入的數在表列中

top=n;
bottom=1;
mid=(top+bottom)/2;

while(flag)
{

//printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);

if( (num>a[top]) || (num<a[bottom]) ) //輸入的數 num>a[top] 或者 num<a[bottom],肯定num不在這個表列中
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num 等於找到的數
{
loc=mid;
printf("找到數 %6d 的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若 a[mid]>num,則num 一定在 a[bottom]和a[mid-1]范圍之內
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若 a[mid]<num,則num 一定在 a[mid+1]和a[top]范圍之內
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}

if(loc==-1)
{
printf("%d 這個數在表列中沒有找到。\n",num);
}
printf("折半查找結束,按任意鍵退出:\n");

}

『貳』 求:c語言實現的查找演算法比較研究

哈希查找、樹表查找、跳錶查找、基數查找。網上搜索最新文獻好像都要錢的。

『叄』 哈希表存儲C語言關鍵字的演算法以及利用Hash查找技術統計該程序中的關鍵字出現的頻度

線性探測,平方探測……

『肆』 C語言常用演算法中,查找無序數列的演算法有哪些

可以用排序+折半查找 代碼如下,編譯軟體DEV C++通過,要查找多少個數只要改一下宏定義就可以了另外要是再優化可以把排序的演算法改一改#define A 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,a[A],j,t,b,min,mid,max,p[A],k;
p[0]=1; p[1]=2; p[2]=3; p[3]=4; p[4]=5; p[5]=6; p[6]=7; p[7]=8; p[8]=9; p[9]=10;
printf("請輸入%d個數\n",A);
for(i=0;i<A;i++)
scanf("%d",&a[i]);
for(i=0;i<A;i++)
for(j=i+1;j<A;j++)
if(a[i]>a[j])
{ t=a[i];
k=p[i];
a[i]=a[j];
p[i]=p[j];
a[i]=t;
p[i]=k;
}
printf("請輸入要查找的數字\n");
scanf("%d",&b);
min=0;
mid=A/2;
max=A-1;
for(i=0;i<A;i++)
{if(b==a[min]) {printf("您所輸入的數為第%d個\n",p[min]); break;}
if(b==a[max]) {printf("您所輸入的數為第%d個\n",p[max]); break;}
if(b==a[mid]) {printf("您所輸入的數為第%d個\n",p[mid]); break;}
if(min>=max) {printf("ERROR 您所輸入的數字%d不在此數組內"); break;}
if(b>a[mid])
{min=mid;<br> mid=(min+max)/2;}
if(b<a[mid])
{ max=mid;
mid=(max+min)/2;}
}
system("pause");
}

『伍』 C語言 查找演算法實現

#include

int main() {
int i,x,n,*result = NULL;
int a[10],low,high,mid;

scanf_s("%d",&n);
// 確保輸入的數據是非遞減的
for(i = 0 ; i < n && i < 10 ; i++) {
scanf_s("%d",&a[i]);
}

fflush(stdin); // 如果輸入的數組元素多於10個,則廢棄
scanf_s("%d",&x);

low = 0,high = n - 1;
while(low <= high) {
mid = (low + high) / 2;
if(x == a[mid]) {
result = &a[mid]; // 這里給出的是查找到該元素的指針
break;
}
else if(x < a[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
if(result != NULL) {
printf("%d\n",*result);
}
else {
printf("no result\n");
}
return 0;
}

『陸』 c語言的折中查找法的演算法

#include <stdio.h>
#define N 21
void main(void)
{
int a[N];
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到數字,則值為1,否則為0
int loc=-1;//要查找的數在表列中的位置,如果loca=-1表示表列中沒有這個數;如果有這個數,則它的值為所在的位置

printf("你想在多少個數中進行折半查找,請輸入(1--20):");
scanf("%d",&n);

while(n<1 || n>20)
{
printf("你輸入的數不正確,請重新輸入。\n");
printf("你想在多少個數中進行折半查找,請輸入(1--20):");
scanf("%d",&n);
}

printf("請你輸入一個整數 a[1]:");
scanf("%d",&a[1]);

i=2;
while(i<=n) //輸入從小到大的表列
{
printf("請你輸入一個整數 a[%d]:",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你輸入的數不滿足要求,請重新輸入。\n");
}

//輸出表列
printf("\n輸出表列\n");
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");

printf("請你輸入要查找的數:");
scanf("%d",&num);

flag=1; //假設輸入的數在表列中

top=n;
bottom=1;
mid=(top+bottom)/2;

while(flag)
{
printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);
if( (num>a[top]) || (num<a[bottom]) ) //輸入的數 num>a[top] 或者 num<a[bottom],肯定num不在這個表列中
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num 等於找到的數
{
loc=mid;
printf("找到數 %6d 的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若 a[mid]>num,則num 一定在 a[bottom]和a[mid-1]范圍之內
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若 a[mid]<num,則num 一定在 a[mid+1]和a[top]范圍之內
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}

if(loc==-1)
{
printf("%d 這個數在表列中沒有找到。\n",num);
}
printf("折半查找結束:");
scanf("%d",&n);
}

『柒』 C語言編寫數據結構查找演算法

實驗五 查找的實現
一、 實驗目的
1.通過實驗掌握查找的基本概念;
2.掌握順序查找演算法與實現;
3.掌握折半查找演算法與實現。
二、 實驗要求
1. 認真閱讀和掌握本實驗的參考程序。
2. 保存程序的運行結果,並結合程序進行分析。
三、 實驗內容
1、建立一個線性表,對表中數據元素存放的先後次序沒有任何要求。輸入待查數據元素的關鍵字進行查找。為了簡化演算法,數據元素只含一個整型關鍵字欄位,數據元素的其餘數據部分忽略不考慮。建議採用前哨的作用,以提高查找效率。
2、查找表的存儲結構為有序表,輸入待查數據元素的關鍵字利用折半查找方法進行查找。此程序中要求對整型量關鍵字數據的輸入按從小到大排序輸入。
一、順序查找
順序查找代碼:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("請輸入您要輸入的數據的個數:\n");
scanf("%d",&(s->length));
printf("請輸入您想輸入的%d個數據;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所輸入的數據為:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
inti=0;
s->r[s->length].key=k;
while(s->r[i].key!=k)
{

i++;
}
if(i==s->length)
{
printf("該表中沒有您要查找的數據!\n");
return-1;
}
else
returni+1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("請輸入您想要查找的數據的關鍵字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的數據的位置為:\n\n%d\n\n",keyplace);
return2;
}
順序查找的運行結果:
二、折半查找
折半查找代碼:
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
intkey;
}keynode;
typedef struct Node{
keynoder[50];
intlength;
}list,*sqlist;
int Createsqlist(sqlist s)
{
inti;
printf("請輸入您要輸入的數據的個數:\n");
scanf("%d",&(s->length));
printf("請由大到小輸入%d個您想輸入的個數據;\n\n",s->length);
for(i=0;i<s->length;i++)
scanf("%d",&(s->r[i].key));
printf("\n");
printf("您所輸入的數據為:\n\n");
for(i=0;i<s->length;i++)
printf("%-5d",s->r[i].key);
printf("\n\n");
return1;
}
int searchsqlist(sqlist s,int k)
{
intlow,mid,high;
low=0;
high=s->length-1;
while(low<=high)
{
mid=(low+high)/2;
if(s->r[mid].key==k)
returnmid+1;
elseif(s->r[mid].key>k)
high=mid-1;
else
low=mid+1;
}
printf("該表中沒有您要查找的數據!\n");
return-1;
}
sqlist Initlist(void)
{
sqlistp;
p=(sqlist)malloc(sizeof(list));
if(p)
returnp;
else
returnNULL;
}
main()
{
intkeyplace,keynum;//
sqlistT;//
T=Initlist();
Createsqlist(T);
printf("請輸入您想要查找的數據的關鍵字:\n\n");
scanf("%d",&keynum);
printf("\n");
keyplace=searchsqlist(T,keynum);
printf("您要查找的數據的位置為:\n\n%d\n\n",keyplace);
return2;
}
折半查找運行結果:
三、實驗總結:
該實驗使用了兩種查找數據的方法(順序查找和折半查找),這兩種方法的不同之處在於查找方式和過程不同,線性表的創建完全相同,程序較短,結果也一目瞭然。

『捌』 誠求用C語言編一個實現常見查找演算法。

折半查找,數組存放的是從31到3的奇數,按從大到小的順序放入
#include <stdio.h>
void main()
{
int array[15];
int i,number;
int top,end,half,temp;
top = 0;
end = 15;
temp = 0;
half = (top + end) / 2;
for(i = 0;i < 15;i++)
array[i] = 2 * (15 - i) + 1;
printf("please input the number:\n");
scanf("%d",&number);
if(number > array[0] || number < array[14])
printf("the array hasn't the number!\n");
else
{
while(top != end)
{
if(array[half] > number)
top = half;
else if(array[half] < number)
end = half;
else
{
printf("the number is the %d number of array!\n",half + 1);
break;
}
temp = half;
half = (top + end) / 2; //折半查詢
if(temp == half)
{
printf("the array hasn't the number!\n");
break;
}
}
}
}

『玖』 希望大家幫幫我啊!!!C語言 哈希表生成及哈希查找演算法 輸入:待哈希數據序列 功能要求:輸出哈希方法和

你看看這個哈希演算法吧、、貌似。,,也差不多咯

#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef int KeyType;
typedef struct /*元素類型定義*/
{
KeyType key; /*關鍵字*/
int hi; /*沖突次數*/
}DataType;
typedef struct /*哈希表類型定義*/
{
DataType *data;
int tableSize; /*哈希表的長度*/
int curSize; /*表中關鍵字個數*/
}HashTable;
void CreateHashTable(HashTable *H,int m,int p,int hash[],int n);
int SearchHash(HashTable H,KeyType k);
void DisplayHash(HashTable H,int m);
void HashASL(HashTable H,int m);
void CreateHashTable(HashTable *H,int m,int p,int hash[],int n)
/*構造一個空的哈希表,並處理沖突*/
{
int i,sum,addr,di,k=1;
(*H).data=(DataType*)malloc(m*sizeof(DataType));/*為哈希表分配存儲空間*/
if(!(*H).data)
exit(-1);
for(i=0;i<m;i++) /*初始化哈希表*/
{
(*H).data[i].key=-1;
(*H).data[i].hi=0;
}
for(i=0;i<n;i++) /*求哈希函數地址並處理沖突*/
{
sum=0; /*沖突的次數*/
addr=hash[i]%p; /*利用除留余數法求哈希函數地址*/
di=addr;
if((*H).data[addr].key==-1) /*如果不沖突則將元素存儲在表中*/
{
(*H).data[addr].key=hash[i];
(*H).data[addr].hi=1;
}
else /*用線性探測再散列法處理沖突*/
{
do
{
di=(di+k)%m;
sum+=1;
} while((*H).data[di].key!=-1);
(*H).data[di].key=hash[i];
(*H).data[di].hi=sum+1;
}
}
(*H).curSize=n; /*哈希表中關鍵字個數為n*/
(*H).tableSize=m; /*哈希表的長度*/
}
int SearchHash(HashTable H,KeyType k)
/*在哈希表H中查找關鍵字k的元素*/
{
int d,d1,m;
m=H.tableSize;
d=d1=k%m; /*求k的哈希地址*/
while(H.data[d].key!=-1)
{
if(H.data[d].key==k)/*如果是要查找的關鍵字k,則返回k的位置*/
return d;
else /*繼續往後查找*/
d=(d+1)%m;
if(d==d1) /*如果查找了哈希表中的所有位置,沒有找到返回0*/
return 0;
}
return 0; /*該位置不存在關鍵字k*/
}
void DisplayHash(HashTable H,int m)
/*輸出哈希表*/
{
int i;
printf("哈希表地址:");
for(i=0;i<m;i++)
printf("%-5d",i);
printf("\n");
printf("關鍵字key: ");
for(i=0;i<m;i++)
printf("%-5d",H.data[i].key);
printf("\n");
printf("沖突次數: ");
for(i=0;i<m;i++)
printf("%-5d",H.data[i].hi);
printf("\n");

}
void HashASL(HashTable H,int m)
/*求哈希表的平均查找長度*/
{
float average=0;
int i;
for(i=0;i<m;i++)
average=average+H.data[i].hi;
average=average/H.curSize;
printf("平均查找長度ASL=%.2f",average);
printf("\n");
}

void main()
{
int hash[]={23,35,12,56,123,39,342,90};
int m=11,p=11,n=8,pos;
KeyType k;
HashTable H;
CreateHashTable(&H,m,p,hash,n);
DisplayHash(H,m);
k=123;
pos=SearchHash(H,k);
printf("關鍵字%d在哈希表中的位置為:%d\n",k,pos);
HashASL(H,m);
}

『拾』 幾種常見的查找演算法之比較

二分法平均查找效率是O(logn),但是需要數組是排序的。如果沒有排過序,就只好先用O(nlogn)的預處理為它排個序了。而且它的插入比較困難,經常需要移動整個數組,所以動態的情況下比較慢。

哈希查找理想的插入和查找效率是O(1),但條件是需要找到一個良好的散列函數,使得分配較為平均。另外,哈希表需要較大的空間,至少要比O(n)大幾倍,否則產生沖突的概率很高。

二叉排序樹查找也是O(logn)的,關鍵是插入值時需要做一些處理使得它較為平衡(否則容易出現輕重的不平衡,查找效率最壞會降到O(n)),而且寫起來稍微麻煩一些,具體的演算法你可以隨便找一本介紹數據結構的書看看。當然,如果你用的是c語言,直接利用它的庫類型map、multimap就可以了,它是用紅黑樹實現的,理論上插入、查找時間都是O(logn),很方便,不過一般會比自己實現的二叉平衡樹稍微慢一些。