從擁有多個屬性的報表集合(資料庫)中,尋找具有特定屬性且位於指定範圍內的元素,這類問題稱為範圍搜尋。
編寫程式,對魔某個二維平面上點的集合,列舉出給定範圍內的點。另外,給定的點集合無法進行點的新增和刪除操作(靜態)。
輸入
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個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...