R樹演算法C 實現

2021-10-01 22:16:19 字數 2047 閱讀 4652

不足結語

參考是最重要的。

首先應該看的就是r樹的**

a. guttman. r-trees: a dynamic index structure for spatial searching. in sigmod conference, 1984.

**中介紹的節點組織結構、不同的**演算法、效率分析,是很多部落格上被省略了的。

rtree研究學習~

都是可以參考的。但僅僅是參考叭,不建議看

為什麼不建議?內容錯倒是沒有錯,但是沒有思想、沒有靈魂。看**就有種順其自然的感覺,等你實現完之後看**,就會恍然大悟,理解得透徹

最後看到了乙個比較詳細的。不過在r樹部分,沒有介紹節點**方法

從b樹、b+樹、b*樹談到r 樹

**上傳到了github上

rtreeindex.cpp

首先最重要的就是結構。如何去定義類,怎麼去組織類與類之間的關係。

這次寫了這麼長時間,組織類的關係是花的時間最長的。

**中把葉子節點非葉子節點分為了兩類進行討論。

葉子節點指向儲存實體,非葉子節點指向節點。

所以實現的時候,分為leafnode與branchnode。

其次,什麼方法應該在父類中實現,什麼方法應該作為抽象方法在子類中實現。

思考這些問題,感覺還是很能鍛鍊對類的理解的。

再乙個需要注意的問題就是什麼時候用指標、什麼時候用引用。

當然可以啥都不用,讓物件一直拷貝、複製。不過效率不高,也不符合設計原則

如何在組織的類結構中,獲取mbr。因為葉節點和分支節點的指向的型別不同,所以對其進行組織的時候,也是花了些腦筋。

總的來說,新增節點分三種情況

葉節點有位置,成功新增。adjusttree不帶參方法

葉節點位置不夠,發生**。**後的新節點新增到父節點中(父節點位置夠)。adjusttree帶參方法,不**parent

父節點位置不夠,父節點發生**。adjusttree帶參方法,**parent,遞迴呼叫adjusttree帶參方法處理父節點**

所以要注意的是adjusttree方法,涉及的是**節點和父節點之間的關係。呼叫者是被**節點

其實**是不涉及遞迴的,就只是單純地把乙個節點變成兩個節點,並調整與子節點之間的引用關係。單獨來看很簡單

注意的是,**的新節點唯一缺少的是,它的父節點對它的引用

所以adjusttree處理的問題是,讓**產生新節點的父節點,具有對它(新節點)的引用

而讓**節點的父節點持有對新節點的引用時,可能發生**。這就是adjusttree裡面主要處理的問題

首先沒有使用模版類。在設計的時候也考慮到了,不過因為時間問題,沒有換成模版類。命名的時候考慮到了這個問題,所以leafnode中指向實體的命名是values而不是features。

其次,如果使用模板類,需要給儲存物件提供最小外接矩形介面。實現了這個介面的物件能夠通過相應方法獲取對應mbr。模版中的型別也應該是這個介面的子類。

最後,還是結構的問題。

對於分支節點和葉結點來說,他們指向的實體是有共性的:都具有最小外接矩形,都是使用的qvector進行儲存。

因此是可以進一步抽離出父類的。抽離之後,可以減少分支節點和葉結點中一些重複的**。

不過問題是,這樣抽離,從某種程度上來說也增加了複雜度,是不是有些過度了呢?

就是這樣一些的問題一直伴隨著整個實現過程,導致寫一下就要思考一下,就很慢。

想了想,其實實現起來只遇到了乙個問題。就是**節點的時候,**得到的新節點,在branchnode中直接複製了leafnode的**,導致子節點的父指標沒改,新的**節點的指標也複製掉了。導致出了一些問題。其他的都是一遍過。最後跑起來的時候,只有這個地方有問題。

剩下的時間都是花在類的組織上了。

只要弄清楚了上面幾個問題,跟著**、或者中文博文,實現起來是沒什麼太大問題的。

如果不考慮類結構什麼的話,直接乙個類,全放一起,當然也是可以實現的,應該要實現得更快。不過結構可能就不夠清晰了。

分類演算法 決策樹演算法及其R實現

以鳶尾花為例子來說明 觀察上圖,判決鳶尾花的思考過程可以這麼來描述 花瓣的長度小於2.4cm的是setosa 圖中綠色的分類 長度大於2.4cm的呢?可以通過寬度來判別,寬度小於1.8cm的是versicolor 圖中紅色的分類 其餘的就是virginica 圖中黑色的分類 用圖形來形象的展示上述思...

演算法 R樹的研究及實現(1)

從b樹 b 樹 b 樹談到r 樹 r樹的理論比較容易看明白,但是博主並沒有給出幾個核心演算法實現,譬如 節點 節點 包含兩個情況的 葉子節點關鍵字大於m,需要將座標點按照幾何 非葉子節點子樹數量大於m,需要將子樹代表的矩形按照幾何進行 這兩個演算法是核心演算法,我搜尋了部分資料,並且貼出來 請注意 ...

R分類演算法 決策樹演算法

它通過對訓練樣本的學習,並建立分類規則,然後依據分類規則,對新樣本資料進行分類 屬於有監督學習。優點 決策樹有易於理解和實現 決策樹可處理數值型和非數值型資料 基於條件的決策樹在party包裡 install.packages party ctree formula,data predic資料 pr...