在之前的兩篇文章中,我們總結了八種經典的排序演算法,分別為直接插入排序,希爾排序,簡單選擇排序,堆排序,氣泡排序,歸併排序,快速排序,基數排序,並分別用python和c++來實現每個排序演算法。在這篇文章中,我們將繼續學習資料結構中的三種常用的查詢演算法:二分查詢,塊查詢,雜湊查詢。
二分查詢作為最簡單的一種查詢方式,已經被很多人應用。二分查詢所查詢的物件必須是乙個有序陣列,即如果一開始查詢的是無序陣列,首先要進行排序時候才能實行二分查詢。
假如我們要查詢乙個公升序陣列裡面的某乙個數,二分查詢就是將查詢的鍵和子陣列的中間鍵作比較,如果被查詢的鍵小於中間鍵,就在左子陣列繼續查詢;如果大於中間鍵,就在右子陣列中查詢,否則中間鍵就是要找的元素。
**實現:
python版本:
def binary_research(list,key):
left = list[0]
right = len(list)-1
while(left<=right):
mid = left + (right - left) // 2
if list[mid]==key:
return mid
elif list[mid]key:
right = mid - 1
return -1
if __name__ == "__main__":
array = [3, 7, 8, 16, 17, 20, 33]
pos = binary_research(array,16)
print("要查詢的數在 %d 索引處:"%(pos))
c++版本:
int binary_search(int arr, int length, int key)
else if(arr[mid]>key)
else
}return -1;
}
有時候,可能會遇到這樣的表:整個表中的元素未必有序,但若劃分為若干塊後,每一塊中的所有元素均小於(或大於)其後面塊中的所有元素。我們稱這種為分塊有序。
首先,我們需要先建立乙個索引表,索引表中為每一塊都設定–索引項,每乙個索引項都包含兩個內容:
在前面建立的索引表的基礎上,我們查詢乙個關鍵字需要兩個步驟:
在索引表中查詢,目的是找出關鍵所屬的塊的位置。這裡如果索引表較大的話,可以採用折半查詢。
進入該塊中,使用簡單順序表查詢演算法進行關鍵字查詢。
**實現:
#includeusing namespace std;
struct index_table
indextable[3];
int block_research(int a, int key)
return -1;
} return -1;
}int main() ;
int index = 0;
//將索引表分成3塊,每塊兩個元素
for (int i = 0; i < 3; i++)
indextable[i].maxnum = max;
index += 2;
} int pos = block_research(a, 11);
cout << pos;
return 0;
}
雜湊技術是在記錄的儲存位置和記錄的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f(key)。查詢時,根據這個確定的對應關係找到給定值的對映f(key),若查詢集合中存在這個記錄,則必定在f(key)的位置上。 雜湊技術既是一種儲存方法,也是一種查詢方法。
雜湊表也是一種資料結構,理想情況下可以不需要任何比較,一次訪問便能得到所查記錄。所以它的優點就是查詢特定記錄的速度快。但因為雜湊表是基於陣列的,所以建立後就難於擴充套件,而且不利於遍歷資料。
c中雜湊表使用struct結構實現,包含兩個元素,乙個是int型的amount,表示當前雜湊表中包含的元素個數; 乙個是type* 型別的arr,用來實際存放資料;
構建雜湊表之前需要定義雜湊函式,定義 key和儲存位址之間的對映關係,根據對映結果,把key存放到對應的arr下標位置上。
查詢的時候,直接使用key和雜湊函式,對應出在雜湊表中的位置資訊,從arr中取出即可。
#include#include#define hashsize 12
#define nullkey -32768
typedef struct
hashtable;
int m=0;
//初始化雜湊表
int inithashtable(hashtable *h)
//雜湊函式,定義 key和儲存位址之間的對應關係
int hash(int key)
//插入關鍵字進入雜湊表
void inserthash(hashtable *h,int key)
//雜湊表查詢關鍵字
int searchhash(hashtable h,int key,int *addr)
}return *addr; }
int main()
; hashtable h;
int i;
inithashtable(&h);
for(i=0;ips:參考部落格
資料結構 資料結構的三大結構
計算機程式設計 資料結構 演算法 資料結構研究變數的管理方式,演算法研究解決特定問題的方法。資料結構分三個層次 邏輯結構 抽象層 物理結構 結構層 運算結構 實現層 邏輯結構指人對資料之間關係的理解和看法,邏輯結構和計算機無關。邏輯結構 1 集合結構 這種結構表示資料可以合併成乙個整體。這是資料之間...
資料結構(1) 資料結構的三大結構
什麼是資料結構 1.資料結構的有關定義 1 資料結構 是帶有結構資料元素的集合 2 資料 是客觀事物的數值 字元以及能輸入機器且能被處理的各種符號的集合 編譯 鏈結 源程式 c 目標程式 obj 可執行程式 exe 3 資料物件 是性質相同的資料元素的集合 4 資料型別 一組性質相同的值的集合以及定...
資料結構(三)查詢演算法(1)順序查詢
一片儲存空間的中的資料既可能是有序的 也可能是無序的,有序可以是公升序 降序 分塊公升序等等 對於無序存放的陣列只能通過順序查詢的方法找到想要的資料 順序查詢就是從資料空間的一端到另一端,逐個資料進行比對,直至找到想要的資料 按照這種說法,最終可能出現兩種情況 找到元素,找不到,超出邊界 這樣每次需...