【问题标题】:No more than d+1 comparisons for member function of binary search tree二叉搜索树的成员函数不超过d+1次比较
【发布时间】:2020-04-15 15:44:12
【问题描述】:

Purely Functional Data Structure 中的练习 2.2 表明原始 member 函数在最坏的情况下执行大约 2d 比较,其中 d 是树的深度。根据this paper,作者建议重写member 函数,通过跟踪可能等于查询元素的候选元素(例如,

以下是代码:

data Tree a = Leaf 
            | Fork (Tree a) a (Tree a)
            deriving (Show, Eq)

-- The original member function.
member :: Ord a => a -> Tree a -> Tree a
member _ Leaf = False
member x (Fork l y r)
  | x < y = member x l
  | x > y = member x r
  | otherwise = True

-- The improved member function that I write.
member' :: Ord a => a -> Tree a -> Tree a
member' v t = loop Nothing v t
  where
    loop candidate _ Leaf = Just x == candidate
    loop candidate x (Fork l y r)
      | x < y = loop candidate x l
      | otherwise = loop (Just y) x r

现在我的问题是:

  1. 根据the paper,我改进的member功能对吗?

  2. 在最坏的情况下,改进的member 比原来的更有效,因为它的比较不超过d + 1 次。但根据算法,改进后的member 将对每个查询进行d + 1 比较。对于原始的member,如果查询值等于根值,则只比较两次,而改进后的member 似乎仍然需要d + 1 比较。因此,在最好的情况下,改进后的算法似乎不如原来的算法有效。我在这里有什么误解吗?其实the paper关于算法的内容如下:

到达搜索节点时,算法不会终止 但在右子树中继续。由于该子树中的所有元素 大于搜索的,算法将不再 通过该节点后右转。因此,如果元素搜索 是在树中找到它必须在最后一个节点中 右转,就是candidate所指的节点。

看来这就是我对算法的理解。

  1. 如果第 2 点为真,那么除了使用 Haskell 中的三路比较功能 compare 之外,如何改进算法以使其在最佳情况下不需要比较 d + 1 次?

感谢您提供任何信息!

【问题讨论】:

    标签: algorithm haskell binary-search-tree


    【解决方案1】:

    这是我如何进行二进制搜索的 BST 等效项:How can I simplify this working Binary Search code in C?

    最简单的描述是“找到它所属的位置,然后检查它是否在那里”。

    您说得对,因为在最佳情况下进行 3 路比较时效率不高,但最佳情况不太可能。在 average 命中情况下,3 路过程需要 2(d-1) 次比较,而在所有未命中情况下,它需要 2d。

    然而,这两种算法中的比较都不是多余的,因此任何一种情况都不能在不使其他情况变得更糟的情况下得到改进。

    给定具有唯一键的深度为 d 的完整树,考虑两种算法都将执行一系列二进制比较,以识别目标节点(2d-1 个可能性)或它将被插入(2d 种可能性)。这是 2d+1-1 个可能的答案。

    考虑为可能的答案生成霍夫曼编码:https://en.wikipedia.org/wiki/Huffman_coding

    比较结果是从一组可能性中识别正确答案的位序列。如果所有答案的可能性相同,那么无论找到哪个答案,最优编码都需要 (d+1) 位。

    平均而言,所有其他编码都更差。 (如果您有兴趣,多少可以通过 Kullback-Leibler 散度来确定:https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多