我的線索存儲焦炭和位置(這是在當前字被讀取結束的文本的位置)的當前節點。如何使一個字的線索店reincidence用C
如果我讀了100位和第200位另一個詞「富」字「富」,如何讓我的節點商店這2 ocurrences?有沒有一個快速的方法(數組或更快的實現)還是我需要實現鏈表?
我的線索存儲焦炭和位置(這是在當前字被讀取結束的文本的位置)的當前節點。如何使一個字的線索店reincidence用C
如果我讀了100位和第200位另一個詞「富」字「富」,如何讓我的節點商店這2 ocurrences?有沒有一個快速的方法(數組或更快的實現)還是我需要實現鏈表?
所以,你的字典樹節點看起來像
struct trie_node {
struct trie_node *next;
strict trie_node *child;
wchar_t character;
off_t position;
};
代替,如果數據總是在內存中,當然你可以使用size_t position;
。
如果我們假設許多前綴不映射到特定位置(因爲它們是不完整的話),這可能是使用了位置獨立的陣列,即有用。
struct positions {
size_t count_max;
size_t count;
off_t position[];
};
struct trie_node {
struct trie_node *next;
struct trie_node *child;
wchar_t character;
struct positions *position;
};
不對應於完整單詞的字符節點可以有NULL position
成員。 count_max
對應於分配的職位數量,並且count
對應於當前的職位數量。數組可以在必要時重新分配和調整大小。這種數組調整在實際應用中很常見; (重新分配)的開銷被認爲是相當可接受的,尤其是與替代方案相比。
另一個有趣的選擇是使用線性數組來表示的順序在文本的話,因爲它們出現,在指定所述陣列中的第一次出現的索引的字典樹節點的position
構件。每個陣列條目將包含下一個出現的索引,加上任選的鏈接回字典樹節點:
#include <stdlib.h>
#include <limits.h>
struct trie_node {
struct trie_node *next;
struct trie_node *child;
wchar_t character;
size_t index; /* NO_INDEX if no occurrences */
size_t occurs; /* Num of occurrences, optional */
wchar_t word[]; /* Optional, entire word */
};
/* When 'index' refers to 'none', use: */
#define NO_INDEX SIZE_MAX
struct occurrence {
off_t offset;
size_t next;
struct trie_node *node; /* Optional */
};
的容器結構將具有的陣列,且該特里結構將懸吊它:
struct text {
size_t count_max;
size_t count;
struct occurrence *occurrences;
struct trie_node *trie;
};
然後你的函數會帶一個指向struct text
的指針。
在struct text
的occurrences
陣列可以根據需要被動態地重新分配。 (這也是爲什麼first
成員特里樹節點是索引數組,而不是一個指針:如果它是一個指針,我們可能要經過整個特里更新所有節點的指針,重新分配時陣列,否則。)
注意,因爲我們使用一個size_t
作爲索引到所述陣列,NO_INDEX
是最大可能值,並且size_t
是無符號整數類型,它是足夠的,以檢查if (i < count)
以驗證索引i
已驗證。
對應於一個完整的字中的每個字典樹節點具有index != NO_INDEX
,和C99柔性陣列構件word
初始化爲全字(包括結尾L'\0'
)。該occurs
成員將有字的出現次數,如果它是有用。 (對於它,沒有需要,除了我們人類可能對每個詞的出現次數感興趣之外。)
該方案允許直接訪問文本中的單詞序列。
如果在數組中增加偏移量,則可以使用二分查找來查找特定偏移之間的單詞。因爲每個事件都有一個反向鏈接到trie節點,該節點包含word
成員中的完整單詞,所以很容易打印出文件中出現的任何單詞,而不必掃描整個樹狀結構。
我寫了這個答案,因爲我想說明如何以這種方式組合兩個非常不同的數據結構,可以打開非常有效的訪問數據的方法。我不能說是否有用,因爲有用性取決於正在解決的問題。
當元素數量未知並且事先沒有使用無用區域時, 當使用數組時,隨着元素數量的增加,擴展數組的過程變得不利。如果在這種情況下不需要隨機訪問,則鏈接列表是有利的。在處理少量數據時,兩者沒有多大區別(數組可能是有利的,但實際時間並不重要) – BLUEPIXY
兩者沒有太大的區別 - >沒有太大的區別。 – BLUEPIXY
在維基百科有一個很好的介紹[** Trie - 實施策略**](https://en.wikipedia.org/wiki/Trie#Implementation_strategies)。 –