【Tree 3】樹形結構數據加載的思考


前面兩篇文章,分別介紹了使用遞歸和非遞歸算法加載樹形結構數據的方式,本篇文章,則是自己閑下來的時候,進行的一點小思考。


一、什么地方會用到樹形結構

剛開始一看到這種結構的時候,最先是想到了家譜。家譜就是一種樹形結構,那是一種對我來說最為直觀的一種理解。然后,在程序開發中,發現,樹形結構的應用,更多的是出現在一些后台管理系統。而其具體應用,則是作為類似於windows文件夾的一個菜單導航作用。

而,最近在做的一個項目中,在加載某一產品的類別時,也用到了樹形結構。比如說:


生活類

--------A

--------------a

--------B

辦公類

--------A

--------B


但就其主要的應用場景,在我目前接觸到的項目中,還是后台管理系統統居多。一般,作為后台的管理系統來說,對於性能的要求相對來說沒有web端高。其次,一個比較合理的程序設計,一棵樹的設計,不會超過太多的分支,比如說,生活類下面,不能超過10個。總體來說,整個菜單項,控制在50—100個左右,是比較多的。而一個類別的深度,也最多是在4-5度左右。個人感覺,如果超過了4-5度,這個程序的設計必須再靠機會考究。(PS:4-5度,已經是我個人的極限了)


二、加載樹形結構的幾種方式

1,使用遞歸一次性全部加載

2,使用循環一次性全部加載

3,按需加載(使用到那個,再加載哪個。有些目錄,它可能是用不到的,加載出來干嘛。但是,這樣的話,無疑又增加了數據庫的IO操作)

分析:

前提:用戶很少說一次會把每個節點目錄的東西都點一遍,它只會挑選為數不多的幾個菜單項進行操作。而根據遺傳算法的基本思想(用戶上次選擇了哪些菜單項,她下次還有可能會選擇哪些菜單項,靠,我感覺說是程序的局部性原理會更切合實際一點。勿噴,個人聯想),或者說是CPU 如果說數據比較少的話,那么使用第二種方法,我認為還是比較合理的。但如果數據多的話,或許使用第三種才是更合適的。

附:科普程序的局部性原理(往簡單了說,內存的高速緩存區據說就是根據這個原理來的)

空間局部性;

如果一個用戶在本次訪問了2號區域數據,比如說上圖的生活類 A,那么挨着這個2號區域的周邊數據,很有可能會被這個用戶下次訪問。

時間局部性:

如果一個程序,這次執行了指令,比如說執行了查詢用戶的select語句,那么,這條語句,很有可能在不久后,再次被使用執行。


三、個人總結

其實,我個人感覺,在程序開發中,局部性原理還是存在的。比如說一些大型的網站利用爬蟲爬到的數據,分析一個用戶的消費偏好等,這不就是這個用戶總是買生活用品,他下次還有可能買生活用品的東東嘛。所以,或許可以做緩存,或者說,靜態樹形結構(對於一些比較穩定的,我感覺是絕對可以的,而對於一些有先后關系的數據,那么之前的幾種,也可以考慮做一下緩存)

還有,在實際的應用中,我們通常會將整個樹形結構的節點數據保存起來,但通常,用戶真正要獲得的數據,只是在最后一層,才是相對來說真正有意義的。那么,或許我們可以直接將大體上的菜單項寫進緩存,或者寫進程序(因為它沒有實際意義,通常很穩定)比如說:

用戶管理

----------A

---------------a

----------B

報表控制

---------A報表

---------B報表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM