4. 資料結構高階四靜態查詢之索引順序查詢
「凡是新的事情在起頭總是這樣一來的,起初熱心的人很多,而不久就冷淡下去,撒手不做了,因為他已經明白,不經過一番苦工是做不成的,而只有想做的人,才忍得過這番痛苦。
-- 陀思妥也夫斯基」
我們繼續靜態查詢的索引順序查詢。
首先把表長為n的線性表分成b塊,前b-1塊記錄個數為s=n/b,第b塊的記錄個數小於等於s。在每一塊中,結點的存放不一定有序,但塊與塊之間必須是分塊有序的(假定按結點的關鍵字值遞增有序)。即指後乙個塊中所有記錄的關鍵字值都應比前乙個塊中所有記錄的關鍵字值大。為實現分塊檢索,還需建立乙個索引表。索引表的每個元素對應乙個塊,其中包括該塊內最大關鍵字值和塊中第乙個記錄位置的位址指標。顯然這個索引順序表是乙個遞增有序表。如下圖1
基本思想:先建立索引(最大(最小)關鍵字表)。要查詢關鍵字為key的元素,先按折半查詢獲得key對應記錄所在的塊,再按線性(順序)查詢在塊中找到key對應的記錄。
struct
element ;
struct
index ;
定義乙個元素和索引元素的結構體。
元素結構體包括乙個key和乙個data.
元素結構體包括乙個位址和乙個最大key值。
輸入要測試資料量。malloc分配測試資料量的記憶體。
呼叫initdata函式進行隨機初始化,然後將陣列按大到小進行排序。
然後呼叫createidxtable函式進行建立索引表。
然後輸入乙個key來查詢,呼叫searchposition來查詢key所在的分組,不存在則輸出查詢失敗。
然後根據searchposition 返回的key所在的分組,呼叫seqencesearch函式得到key在分組中的哪個位置,並輸出。結束。
如下圖2
輸入元素指標,元素個數,兩個指向long的指標。
根據元素個數,獲得元素需要分組的個數(開方)。
將分組個數保留。
判斷元素個數是否剛好可以開方,如16開方為4。
建立需要分組個數的索引個數。
然後處理每個所以的位址,從0開始,共len個(len 為陣列長度的開方,或者開方加1)。
尋找該分組最大key值。分組最大值就是該分組的最後乙個,因為陣列已經從小到大經過的排序。
最後返回索引的指標。
輸入索引表,分組數量,查詢次數的指標,以及需要查詢key值。
如果key和索引表的第乙個最大值相等,那麼返回第乙個索引位址。
如果key和索引表的第後乙個的最大值相等,那麼返回第後乙個索引位址。
如果不是則往中間找,最後返回key值所在的分組,也即是索引最大的陣列下標。
輸入陣列指標,起始值,判斷索引位址是否是最後乙個分組輸入不同引數,查詢次數,關鍵key值。
如果是最後乙個分組的,則輸入num - (tlen - 1) * plen 表示最後一組中存在的元素個數。
如果不是最有乙個分組的,則輸入plen,表示正常分組中陣列的個數。
如果存在該值則返回該值的陣列下標。
將所有元素按大到小進行排序。
自動根據需要測試的資料量,自動生成需要的隨機數。
輸出排序後的所有元素。
#include
#include
#include
#include
#include
#include
struct
element ;
struct
index ;
struct
index
*creatidxtable(
struct
element
*elems
, long
elen
, long
*tlen
, long
*plen)
return
itable; }
long
searchposition(
struct
index
*itable
, long
length
, long
*times
, long
key)
return
-1; }
long
seqencesearch(
struct
element
*elems
, long
start
, long
length
, long
*times
, long
key)
return
-1; }
void
selectionsort(
struct
element
*elems
, long
length)
} if(k != i)
} }
void
initdata(
struct
element
*elems
, int
length)
} void
output(
struct
element
*elems
, int
length)
} void
main()
else
else
printf(
"查詢失敗!
\n"); }
free(elems);
free(itable); }
system(
"pause");
}
資料結構之查詢(四) 線性索引查詢
索引就是把乙個關鍵字與它對應的記錄相關聯的過程。索引按照結構可以分為線性索引,樹形索引和多級索引。我們這裡就只介紹線性索引技術。所謂線性索引就是將索引項集合組織為線性結構,也成為索引表。分為 稠密索引,分塊索引和倒排索引。稠密索引 對於稠密索引這個索引表來說,索引項一定是按照關鍵碼有序的排列。分塊索...
資料結構之查詢一靜態查詢
今天將資料結構的查詢章節的知識點總結一下,以前在課堂上沒有好好聽,所以現在不得不將這些基礎拿出來再預習 學習 複習,哎,苦逼的程式媛。下面進入正題。在非數值運算問題上,資料存數量一般很大,為了在大量資料中找到某些值,需要用到查詢技術,為了提高查詢效率,需要對一些資料進行排序。查詢和排序的資料處理量幾...
資料結構之查詢一靜態查詢
分類 資料結構 2013 08 08 11 38 264人閱讀收藏 舉報資料結構查詢 今天將資料結構的查詢章節的知識點總結一下,以前在課堂上沒有好好聽,所以現在不得不將這些基礎拿出來再預習 學習 複習,哎,苦逼的程式媛。下面進入正題。在非數值運算問題上,資料存數量一般很大,為了在大量資料中找到某些值...