查詢演算法 分塊查詢

2021-10-24 17:17:27 字數 4332 閱讀 4283

分塊查詢也稱為索引順序表查詢。分塊查詢就是將順序表(主表)分成若干個子表,然後為每個子表建立乙個索引表,利用索引在其中乙個子表中查詢。

兩部分:

索引表:儲存順序表的每個子表的開始索引和最大值。

順序表:主表所有資料存放的位置。

子表內可以是無序的,但是子表之前面的子表中每個元素必須小於後面子表中的每個元素。

純個人的一些理解,歡迎一起溝通交流

1.2.1. 前言

1.2.2. 我的理解

後面我仔細想了了下,認為「程式=資料結構+演算法」其中資料結構和演算法是有先後關係的,我們要先確定我們的資料結構才能確定我們將使用何種演算法。我們不應該先挑選演算法,然後刻意的讓我們的資料結構去適應演算法(例:比如我們需要維護乙個增長的無序的陣列,會不段有新資料來,這時我們如果提前決定使用二分查詢那樣的話我們就必須每新增乙個資料,都要查詢這個資料應該存放的位置以保證陣列順序,這樣的話我們每來乙個資料,查詢該資料存放的位置都是很大的效能消耗。)

那應該在何時使用分塊查詢呢,應該是資料本身具有塊的屬性,意思是不用我們主動分塊資料本身就帶塊的資訊時使用分塊查詢。

例1:假設身份證號碼的規則是xx(省或直轄市代號)+***增長的id(不考慮3位不夠用),北京代號為:01,上海代號為:02,廣東省代號為:03…

那麼裡面具體的人的身份證號就應該是01001、01002、02001、02002、03001、03002…

這時候我們需要在記憶體裡面維護乙個動態的陣列,我們就可以按照北京大於等於1000小於2000、上海大於等於2000小於3000等進行分塊,不需要我們主動通過演算法遍歷分塊應該通過發現資料其他特點進行分塊,同時我們也不會糾結到底分多少塊。

3.1.1. 檔案樹形圖

blocksearch

├── block_search.go

├── block_search_test.go

└── go.mod

3.1.2. **

block_search.go

package blocksearch

const blocksize =

4type index struct

// 索引表

type indextable [

]index

// 順序表

type ordertable [

]int

func

blocksearch

(dest int

, indextable indextable, ordertable ordertable)

intfor index := indextableitem.startindex; index < blocksize+indextableitem.startindex; index++

}break

}return-1

}

block_search_test.go

package blocksearch

import

"testing"

func

testblocksearch

(t *testing.t),,

,,} ordertable :=

int dest :=-11

index :=

blocksearch

(dest, indextable, ordertable)

t.logf

("index:%d dest:%d"

, index, dest)

if index !=-1

&& dest != ordertable[index]

else

dest =

13 index =

blocksearch

(dest, indextable, ordertable)

t.logf

("index:%d dest:%d"

, index, dest)

if index !=-1

&& dest != ordertable[index]

else

}

3.1.3. 測試結果
=== run   testblocksearch

testblocksearch: block_search_test.go:33: index:-1 dest:-11

testblocksearch: block_search_test.go:37: -11測試成功

testblocksearch: block_search_test.go:42: index:6 dest:13

testblocksearch: block_search_test.go:46: 13測試成功

--- pass: testblocksearch (0.00s)

pass

上面的塊前提條件是順序表每個子表長度都是一致情況下,但正常情況還有可能出來順序不一致情況,這時我們在索引表中就需要記錄當前塊的長度。

4.3.1. go版本

4.3.1.1. 檔案樹形圖

blocksearch

├── block_search.go

├── block_search_test.go

└── go.mod

4.3.1.2. **

block_search.go

package blocksearch

type index struct

// 索引表

type indextable [

]index

// 順序表

type ordertable [

]int

func

blocksearch

(dest int

, indextable indextable, ordertable ordertable)

intfor index := indextableitem.startindex; index < indextableitem.length+indextableitem.startindex; index++

}break

}return-1

}

block_search_test.go

package blocksearch

import

"testing"

func

testblocksearch

(t *testing.t),,

,,} ordertable :=

int dest :=

30 index :=

blocksearch

(dest, indextable, ordertable)

t.logf

("index:%d dest:%d"

, index, dest)

if index !=-1

&& dest != ordertable[index]

else

dest =

13 index =

blocksearch

(dest, indextable, ordertable)

t.logf

("index:%d dest:%d"

, index, dest)

if index !=-1

&& dest != ordertable[index]

else

}

4.3.1.3. 結果
=== run   testblocksearch

testblocksearch: block_search_test.go:37: index:10 dest:30

testblocksearch: block_search_test.go:41: 30測試成功

testblocksearch: block_search_test.go:46: index:5 dest:13

testblocksearch: block_search_test.go:50: 13測試成功

--- pass: testblocksearch (0.00s)

pass

查詢演算法之分塊查詢

演算法思想 1.將n個資料元素 按塊有序 劃分為m塊 m n 2.每一塊中的結點不必有序,但塊與塊之間必須 按塊有序 3.即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字 4.而第2塊中任一元素又都必須小於第3塊中的任一元素,分塊查詢是折半查詢和順序查詢的一種改進方法,分塊查詢由於只要求...

查詢演算法 分塊演算法

查詢演算法 分塊演算法 查詢演算法主要有三種 線性查詢 二分查詢 分塊查詢 線性查詢效率最慢,可對無序列表進行查詢 二分查詢效率最快,只能針對有序列表進行查詢 分塊查詢的思路 分塊查詢中,每個塊中元素不一定有序的,塊間是有序的。分塊又稱索引順序查詢,這是順序查詢的一種改進方法,用於在分塊有序表中進行...

驗證分塊查詢演算法

include define maxl 100 資料表的最大長度 define maxi 20 索引表的最大長度 typedef int keytype typedef char infotype 10 typedef struct nodetype typedef nodetype seqlist...