查詢:
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基本概念 在討論排序的概念之前,首先引入 排序碼 的概念。排序碼是結點中的乙個或多個字段,其值作為排序運算中的依據。排序碼...