高等資料結構 kD Tree

2021-09-25 05:57:40 字數 1808 閱讀 2453

從擁有多個屬性的報表集合(資料庫)中,尋找具有特定屬性且位於指定範圍內的元素,這類問題稱為範圍搜尋。

編寫程式,對魔某個二維平面上點的集合,列舉出給定範圍內的點。另外,給定的點集合無法進行點的新增和刪除操作(靜態)。

輸入

nx0 y0

...xn-1 yn-1

qsx0 tx0 sy0 ty0

...sxq-1 txq-1 syq-1 tyq-1

輸出 對於每個區域,按編號公升序輸出點集合中滿足sxi≤x≤txi且syi≤y≤tyi的點的編號

0≤n≤500000

0≤q≤20000

-1000000000≤x,y,sx,tx,sy,ty≤1000000000

sx≤tx

sy≤ty

示例 6

2 12 2

4 26 2

3 35 4

22 4 0 4

4 10 2 5

示例輸出01

2 42

3

5

對於這個問題我們利用劃歸思想,將2d轉化為1d來考慮一下。對於一維,就變成了一維的搜尋,我們可以使用二叉樹的結構來儲存資料。將集合繪製成二叉樹。

樹節點號32

1540

8769

編號/數值

0/11/3

2/53/6

4/10

5/13

6/14

7/16

8/19

9/21

表中的樹節點順序為前序遍歷,編號順序為中序遍歷,構造起來如圖所示。

np = 0//初始化編號

make1dtree(0,n)

make1dtree(l,r)

if!(l儲存好資料之後需要有方法查詢。

find(v,sx,tx)

x=p[t[v].location].x

if sx<=x&&x<=tx

print p[t[v].location]

左子樹部分

if t[v].l!=nil&&sx<=x

find(t[v].l,sx,tx)

右子樹部分

if t[v].r!=nil&&x<=tx

find(t[v].r,sx,tx)

這個演算法可以擴充套件至k維空間。我們需要構建為「kd樹」的資料結構,就可以搜尋指定的區域了。接下來看看二維平面內如何對點進行搜尋吧。對於一維的我們只需對x進行排序,而二維的話我們要對x,y分別排序,按照樹的深度進行迴圈。比如深度為偶數時以x為基準,為奇數時以y為基準,二者交替出現。此過程像畫網格一般。

查詢時也需要按照深度偶x奇y的規則查詢。

#include#include#includeusing namespace std;

//定義結點資訊

class node

};//定義點資訊

class point

point(int id,int x,int y)

bool operator < (const point &p) const

if(depth%2==0)

if(t[v].r!=nil)

}else

if(t[v].r!=nil) }}

int main()

printf("\n");

} return 0;

}

資料結構研究之十二 高等動態規劃法

1.硬幣問題 a.題目 給定面值不同的m種硬幣,求支付n元時的最少硬幣數,各硬幣可以重複使用 b.核心思路 關鍵在於使用t i j j 表示用第i種硬幣支付j元的情況,這表示是否使用第i種硬幣 c.created by 葉子 on 2018 2 8.硬幣問題 include iostream usi...

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...