[英]Implementing a tree from scratch
我試圖通過從頭開始實現一個來學習樹。 在這種情況下,我想用C#Java或C ++來做。 (不使用內置方法)
因此每個節點將存儲一個字符,每個節點最多有26個節點。
我將使用什么數據結構來包含指向每個節點的指針?
基本上我正在嘗試從頭開始實現基數樹。
謝謝,
我將使用什么數據結構來包含指向每個節點的指針?
一個節點。 每個節點都應該引用樹中的(最多)26個其他節點。 在Node中,您可以將它們存儲在數組,LinkedList,ArrayList或您可以想到的任何其他集合中。
這並不重要。 您可以使用鏈接列表,數組(但這將具有固定大小),或使用您的語言的標准庫中的列表類型。
使用List /數組意味着要進行一些索引簿記來遍歷樹,因此最簡單的方法是只使用對父項中子項的引用。
這是我最近發現的一個不是一個糟糕的樹API - 雖然我需要圖表,看看如何設置它來分離它所持有的數據的數據結構是很方便的,所以你可以有一個等價於Iterator的樹。瀏覽樹,等等。
https://jsfcompounds.dev.java.net/treeutils/site/apidocs/com/truchsess/util/package-summary.html
如果你實際上對速度比空間更感興趣,並且如果每個節點只代表一個字母(隱含最多26個),那么我只使用一個簡單的26個插槽陣列,每個插槽引用一個“節點”(節點是包含數組的對象)。
固定大小的數組的好處是你的查找速度會快得多。 如果你查找的char“c”已經保證是一個較低的套裝字母,那么查找就像下面這樣簡單:
nextNode=nodes[c-'a'];
對字符串的遞歸查找將是微不足道的。
你描述的不是很基數樹......在基數樹,你可以在一個節點的多個字符,且有上子節點的數量沒有上限。
您所描述的內容聽起來更受限於字母...每個節點可以是az,后面可以跟另一個字母,az等。這種區別對於您選擇保存下一個節點指針的數據結構至關重要。
在您描述的樹中,最簡單的結構可能是一個簡單的指針數組......您需要做的就是將字符(例如'A')轉換為其ascii值('65'),然后減去起始值offset(65)確定你想要的“下一個節點”。 占用更多空間,但插入和遍歷非常快。
在真正的基數樹中,您可以有3個,4個,78個或0個子節點,並且“下一個節點”列表將具有排序,插入和刪除的開銷。 慢得多。
我不能說Java,但如果我在C#中實現自定義基數樹,我會使用其中一個內置的.NET集合。 編寫自己的排序列表並不能真正幫助您學習樹概念,並且.NET集合的內置優化很難實現。 然后,您的代碼很簡單:查找下一個節點; 如果存在,抓住它去; 如果沒有,請將其添加到下一個節點集合中。
您使用哪個集合取決於您通過樹實現的具體內容......每種類型的樹都需要在插入時間,查找時間等之間進行權衡。您所做的選擇取決於對應用程序最重要的是什么,而不是樹。
說得通?
感謝您的快速回復。
是的,snogfish說是正確的。 基本上,它的樹有26個節點(AZ)+一個bool是終結者。
每個節點都有這些值,它們相互鏈接。
我還沒有深入學習指針,所以今天我嘗試使用C#中的不安全代碼從頭開始實現這一點。
因此,如果有人能夠使用內部樹類為我提供開始使用C#的代碼,我將不勝感激。 一旦我開始它,我可以將算法移植到其他語言,只需將其更改為使用指針。
非常感謝,邁克爾
看看這個Simeon Pilgrim博客,“ Code Camp Puzzle評論 ”。 其中一個解決方案使用C#中的Radix,您可以下載解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.