簡體   English   中英

一種有效的分位數算法/數據結構,允許樣本隨着時間的推移而更新?

[英]A efficient quantiles algorithm/data structure that allows samples to be updated as they increment over time?

我正在尋找一種有效的分位數算法,該算法允許樣本值隨着時間的變化而“更新”或替換。

假設我有項目1-n的值。 我想把這些放到一個分位數算法中,可以有效地存儲它們。 但是然后說在將來的某個時候, item-i的值會增加。 我想刪除item-i的原始值並將其替換為更新后的值。 特定用例適用於樣本值隨時間遞增的流式系統。

我見過的最接近這種情況的是t-Digest 數據結構 它有效地存儲樣本值。 它唯一缺少的是刪除和替換樣本值的能力。

我還查看了Apache Quantiles Datasketch - 它遇到了同樣的問題 - 無法刪除和替換樣本。

編輯:更多地考慮這一點,不一定需要刪除舊值並插入增量值。 如果存在只能更新值的約束,則可能有一種方法可以更輕松地重新計算內部 state。

如果更新時間O(log n)和分位數計算時間O(log n)對您來說是可以接受的,那么解決方案之一是實現任何類型的自平衡二叉樹( Splay treeAVL-treeRed-Black tree )同時保持HashMap<Key, Node>與樹結構並行(或者如果您知道您的鍵是例如數字0n-1 ,那么您可以將數組用於相同目的)。 您還需要為每個給定節點保留子樹中的節點數(這對於所有提到的自平衡樹都是可能的 - 這是對節點進行更新的所有方法的一個小補充,例如旋轉, ETC。)。

使用鍵 K 更新值的偽代碼,新值 V 將是:

Node node = find_node_in_hash_map_by_key(K); # O(1)
delete_node_keeping_subtree_counts_valid(node); # O(log n)
add_new_node_keeping_subtree_counts_valid(K, V); # O(log n)

由於每個節點中都有可用的子樹大小,因此也可以在O(log n)中獲得分位數 q,因為它幾乎可以讓您在O(log n)時間內按大小訪問第 i 個元素。 該操作的偽代碼如下所示:

# i-th element requested
node = root
while true:
    left = node.left_subtree
    left_count = 0
    if left is not None:
        left_count = left.nodes_count
    if i < left_count:
        node = left # select i-th element in the left subtree
    elif i == left_count:
        return node.value # we have exactly i elements in left subtree, so i-th value is in the current node
    else:
        i -= left_count + 1 # select element i - left_count - 1 from the right subtree
        node = node.right

我不知道這個數據結構有一個好的開源 JAVA 解決方案,但是編寫自己的 AVL 樹並不是那么困難(並且 Splay 樹應該是最簡單的,只是它們最壞的情況復雜度不是O(log n) ,但平均而言,它們應該是好的)。

我們可以保留一個從變量名到值的 Map 和一個由值和名稱組成的鍵的 SortedMap(搜索樹)(例如 value + "_" + name,或者具有這兩個字段的 Comparable object),這樣排序的鍵也是排序的值,但我們也可以有唯一的鍵,以便能夠刪除舊值 + 變量名並引入新值 + 變量名。 這是 HBase 中使用的一種技術,與持久化 TreeMap(自平衡二叉搜索樹)沒有太大區別。

然后計算分位數或百分位數就是掃描結構的問題。

當更新率較高而分位數詢問率較低時,這是有效的。

當要求分位數的速度不是那么低時,我沒有任何好主意,也許還有一組堆結構,這種結構也以某種方式索引以提高刪除效率,例如https://stackoverflow .com/questions/8705099/how-to-delete-in-a-heap-data-structure#:~:text=4%20Answers&text=Actually%2C%20you%20can%20remove%20an,parent%20of%20the% 20old%20 件

暫無
暫無

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

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