SSD5之查詢排序的基本概念

2021-05-14 09:17:41 字數 3633 閱讀 9755

查詢:

1、線序查詢linear search

線序查詢是一種簡單的查詢方式,是按順序在資料集合中查詢的方式,適用於小數量的資料集合,遍歷所有的值,直到找到所找的值。優點:不要求資料存放格式。缺點:只適合小數量的資料集合。stl中find函式執行線序查詢,原型為inputiterator find (

inputiterator first, inputiterator last, const t& value

);前兩個引數是查詢資料集合的迭代器,fisrt是開始的迭代器,last是終止的迭代器,這兩個引數確定了查詢的範圍。

最後乙個引數為要查詢的資料。

如果沒有找到,函式返回指向終止點的迭代器。如果找到,函式返回指向查詢點的迭代器。

2、二分查詢binary

search

二分查詢適合於任何有序資料集合的查詢。方法:1、找到資料集合中間的資料2、由於這是有序的資料集合,假設從左到右依次增大,則把要查的值與中間值判斷,如果要查的值大於中間值,則只考慮中間值的右邊,否則查詢中間值的左邊,不用考慮另一邊的情況。3、然後在步驟2找到的更小的資料集合

重複步驟2,直到找到要找的資料。優點:適合於任何集合;缺點:集合必須為有序的。二分查詢特別適合於大資料量的資料集合。stl中binary_search函式執行二分查詢,原型為:

template 

bool binary_search ( forwarditerator first, forwarditerator last,

const t& value );

first,last是資料集合的迭代器,fisrt是開始的迭代器,last是終止的迭代器,這兩個引數確定了查詢的範圍。最後乙個引數為要查詢的資料。

template 

bool binary_search ( forwarditerator first, forwarditerator last,

const t& value, compare comp );

兩個函式都是返回bool型的值,如果找到,就返回true,否則返回false。

前3個引數的解釋與上邊的解釋相同,最後乙個引數為比較的函式。

排序:1、selection sort 選擇排序

簡單的說,就是把每個資料放到應該存放的位置。

方法:1、建立兩個指標,第乙個指標指向第乙個值,第二個指標指向第二個值,把第乙個指標指向的值假設為最小值。

2、第二個指標浮動,從當前位置浮動到最後乙個,每次浮動比較第二個指標指向的值與最小值,如果第二個指標指向的值比最小值小,則更換最小值,然後第二個指標向後浮動,否則最小值不變,第二個指標直接向後浮動。

3、在第二個指標浮動到最後乙個值後,把最小值放到第乙個指標指向的位置,然後第乙個指標向後移動。

4、重複2、3步,不過每次重複的初始狀態時,第二個指標初始為第乙個指標的後邊,作為浮動的初始位置,每次重複完,第乙個指標向後移動一位。

由於每次重複總能找到第二指標浮動範圍內的最小值,然後依次存放。這樣最後就能把資料集合給從小到大排序了。

特點:由於不知道資料集合是否已經排好序,必須每次把集合排序一遍,即使資料集合已經排好序,這也是選擇排序的缺點之一。

2、quicksort 快速排序

quicksort利用分而治之(divide-and-conquer)的思想,並且使用迭代的思想,即把集合分為許多很小的部分,然後對這些小的部分排序,最後組合在一起,構成乙個有序的集合,每次分割的方式是使用迭代方式。

方法:

1、判斷資料集合大小是否為0或者為1,是0或1的話返回資料集合,不用考慮一下情況。這作為迭代的最基本情況。

2、選擇乙個資料作為節點元素。

3、建立兩個新的資料集合,把小於節點元素的所有資料放到乙個資料集合,把大於節點元素的所有資料放到另乙個資料集合。

4、分別在第一二個資料集合中進行1、2、3步驟,直到每個資料集合大小為0或1。

5、把分割的資料集合和節點按順序排序,就形成了乙個有序的集合。

一般情況下,節點元素選為中間點元素。

考慮這種情況:當選擇的節點元素為最小值元素或最大值元素,那麼將有乙個資料集合沒有元素,但是程式還需要去遍歷所有的值,那麼就會降低程式的執行效率,所以這種情況必須避免。有一種選擇節點元素演算法:median-of-three partitioning,避免了上述所說的情況。

stl中sort函式執行快速排序,適用於vector, deque, string,不適合於list。

原型:

template

void sort (

randomaccessiterator first, randomaccessiterator last );

template

void sort (

randomaccessiterator first, randomaccessiterator last, compare comp

);

first,last是資料集合的迭代器,fisrt是開始的迭代器,last是終止的迭代器,這兩個引數確定了查詢的範圍, 最後乙個引數為比較的函式。

list是用list的sort()函式,即list.sort().

3、雜湊函式(hash functions

雜湊表(hash table)是一種支援元素快速插入、刪除、遍歷的資料結構,經過變形,能夠在規定的時間裡完成這些操作(快速插入、刪除、遍歷)。

雜湊表(hash table)是一種map型別的資料結構。

hashmap、hashset是不同種型別的雜湊表,hashmap儲存鍵值對,hashset根據成員關係儲存資料,是無序儲存。當向hashset結合中存入乙個元素時,hashset會呼叫該物件的hashcode()方法來得到該物件的hashcode值,然後根據hashcode值來決定該物件在hashset中儲存位置。 

雜湊函式能夠使乙個鍵匹配乙個索引,這個索引是鍵相對應值在陣列中的索引。在把乙個鍵與值在陣列中的位置相匹配方面,別的演算法沒有雜湊表快速,高效。雜湊表的優點是只需要提供雜湊函式找到鍵(key),就能找到相應的值(value)

實現雜湊函式的常用的方法是除法方法(division method)。除法方法實現把鍵(key)轉換為unsigned int型的變數,然後這個值被雜湊表的大小除,餘數作為索引值。

當有多個鍵(key)對應與乙個值(value),這就會發生衝突。消除衝突的最好方法是選擇乙個好的雜湊函式。乙個好的雜湊函式能夠通過在表中的位置來表示鍵(key)。

在軟體工程中,雜湊函式的實現一般與雜湊表的實現分離。

4、map簡介

map是一種聯合的資料結構,支援鍵值對(key-value pairs),通過鍵(key)獲取值(value)。

memoizing技術:

考慮y=f(x), 把x和y(即f(x))以(x,y)的格式儲存在雜湊表中,當要執行f(x)時,先查詢x,如果存在x,就直接返回相應的值;如果不存在,就進行計算。因為計算一般比查詢要花更多的代價,所以這個演算法比較高效。

查詢的基本概念

列表 由同一型別的資料元素組成的集合。關鍵碼 資料元素中的某個資料項,可以標識列表中的乙個或一組資料元素。鍵值 關鍵碼的值。主關鍵碼 可以唯一地標識乙個記錄的關鍵碼。次關鍵碼 不能唯一地標識乙個記錄的關鍵碼。查詢 在具有相同型別的記錄構成的集合中找出滿足給定條件的記錄。查詢的結果 若在查詢集合中找到...

排序 排序的基本概念

1,排序的一般定義 1,排序是計算機內經常進行的一種操作,其目的是將一組 無序 的資料元素調整為 有序 的資料元素 2,無序到有序就是排序 2,排序的數學定義 1,假設含 n 個資料元素序列為,其相應的關鍵字序列為 這些關鍵字相互之間可以進行比較,即 在它們之間存在著這樣乙個關係 kp1 kp2 k...

排序的基本概念

排序是資料結構的一種重要運算。本章的5.1節至5.6節介紹內排序的各種方法,5.7節介紹外排序方法。此外,堆排序也是一種典型的選擇排序,有關堆排序的演算法將在第8章中介紹。5.1基本概念 在討論排序的概念之前,首先引入 排序碼 的概念。排序碼是結點中的乙個或多個字段,其值作為排序運算中的依據。排序碼...