簡體   English   中英

什么可以在實踐中使用'TreeDict'(或樹圖)?

[英]What Can A 'TreeDict' (Or Treemap) Be Used For In Practice?

我正在用Python開發一個'TreeDict'類。 這基本上是一個dict,允許您按排序順序檢索其鍵值對,就像Java中的Treemap集合類一樣。

我已經基於關系數據庫中的唯一索引的方式實現了一些功能,例如,允許您檢索與一系列鍵相對應的值,大於,小於或等於按排序順序的特定值的鍵,字符串或按排序順序具有特定前綴的元組等。

不幸的是,我想不出任何需要像這樣的課程的現實生活問題。 我懷疑我們在Python中沒有排序的原因是,在實踐中它們並不經常被要求得到它,但我想被證明是錯誤的。

你能想到'TreeDict'的任何具體應用嗎? 這個數據結構最能解決的任何現實問題? 我只是想知道這是否值得。

我已經看到幾個答案指向“走進有序序列”功能,這確實很重要,但沒有突出顯示另一個重要功能,即“找到第一個帶有鍵> =這個”。 即使沒有真正需要從那里“行走”,這也有很多用途。

例如(這在最近的SO回答中出現),假設您想要生成具有給定相對頻率的偽隨機值 - 也就是說,您給出了一個dict d

{'wolf': 42, 'sheep': 15, 'dog': 23, 'goat': 15, 'cat': 5}

並且需要一種方法來生成'狼',概率為百分之42(因為100是給定的相對頻率的總和),'羊'中有15分,等等; 並且不同值的數量可以非常大,相對頻率也可以。

然后,將給定值(以任何順序)存儲為樹圖中的值,相應的鍵是直到該點的“總累積頻率”。 即:

def preprocess(d):
    tot = 0
    for v in d:
        tot += d[v]
        treemap.insert(key=tot, value=v)
    return tot, treemap

現在,生成一個值可以非常快( O(log(len(d))) ),如下所示:

def generate(tot, treemap, r=random):
    n = r.randrange(tot)
    return treemap.firstGTkey(n).value

其中firstGTKey是一個方法,它返回第一個條目(在此假設示例中具有.key.value屬性),其中包含一個鍵>給定的參數。 我使用這種方法將大型文件存儲為B-Trees,例如(使用例如bsddb.bt_openset_location方法)。

將元素保持在排序順序的原因是為了更快地檢索。 假設我希望字典中的所有值都在排序范圍內。 使用TreeDict然后使用常規hashmap,這要快得多。 它基本上允許您按排序順序保存字典中的所有內容。 我知道在我正在使用的應用程序中使用這樣的類來基本查詢數據結構。

當你需要按鍵的順序瀏覽字典時,它很有用; 偶爾會出現。 我實際上發現它在某些編程競賽中更為常見,然后是其他任何東西(想想ACM等)。

TreeMap最有用的功能是當你想快速找到最小或最大鍵時; 使用排序字典這通常是單個方法調用; 並且在算法上可以在O(log(n))時間內完成,而不是如果集合未排序則迭代每個鍵以尋找最小值/最大值。 基本上,一個更友好的界面。

我遇到的一個比較常見的事情是當對象被特定名稱標識,並且您想要打印出根據名稱排序的對象; 說一個從目錄名到目錄中文件數的映射。

我用過它的另一個地方是excel電子表格包裝器; 從行號映射到行對象。 這使您可以快速查找最后一行索引,而無需遍歷每一行。

此外,當您可以根據HashMaps的需要輕松定義鍵上的比較關系,但不一定是散列函數時,它非常有用。 我能想到的最好(雖然很弱)的例子是不區分大小寫的字符串鍵。

在處理工業過程數據時Dict<DateTime, someClassOrValue>我經常使用Dict<DateTime, someClassOrValue> - 閥門開/關,機械啟動/停止等。

當我需要在相當長的時間內比較開始/停止或開/關事件之間的時間間隔時,對鍵進行排序特別有用。

但是,由於我已經能夠在C#中使用linq,我發現使用IEnumerables並使用IQueryable擴展方法來獲取我需要的信息通常更容易。

幾乎所有“GROUP BY”報告都需要一個排序字典。

summary = sortedDefaultDict()
for row in somePileOfData:
    summary[row.group_by] += row.balance
for k in sorted(summary.keys()):
    print k, summary[k]

這在數據倉庫應用程序中經常這樣做,因此很難表達它的核心。

如果已sorted函數調用不起作用,則從長遠來看會節省大量時間。

你見過這個: http//code.activestate.com/recipes/576998/

它們可以使各種算法更容易實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM