Data structures 具有任意长度数据作为键的函数映射式数据结构?

Data structures 具有任意长度数据作为键的函数映射式数据结构?,data-structures,haskell,map,functional-programming,Data Structures,Haskell,Map,Functional Programming,很有可能这个问题的答案是一个明显而响亮的“没有这样的东西”,但我要试一试:当键具有任意的、通常非常大的大小时,是否有一种类似于功能图的数据结构比标准图更有效 为具体考虑,考虑Haskell型 (Ord k) => Map [k] v 在这种情况下,如果需要对列表进行深层次比较,查找可能需要很长时间。我猜由于列表的任意长度,哈希也是不可能的。我仍然情不自禁地认为可能存在一种聪明的数据结构。散列是不可能的吗?没有可以有效计算的密钥结构前缀 如果没有,那么hashmap呢?取一个非常大的键,将

很有可能这个问题的答案是一个明显而响亮的“没有这样的东西”,但我要试一试:当键具有任意的、通常非常大的大小时,是否有一种类似于功能图的数据结构比标准图更有效

为具体考虑,考虑Haskell型

(Ord k) => Map [k] v

在这种情况下,如果需要对列表进行深层次比较,查找可能需要很长时间。我猜由于列表的任意长度,哈希也是不可能的。我仍然情不自禁地认为可能存在一种聪明的数据结构。

散列是不可能的吗?没有可以有效计算的密钥结构前缀

如果没有,那么hashmap呢?取一个非常大的键,将它简化为一个非常小的键,并将其作为结构的索引

  • 关于黑客
一个测试

如果您有两个几乎相同的长键,Map将从一开始就对它们进行比较,但是trie将只比较先前比较中尚未消除的后缀(如果您明白我的意思的话)。因此,在这种情况下,trie将更具时间效率

尝试可以通过各种方式进行优化,您可能还想看看三元树。

这里有一个:

module ListMap where
import Data.Map as M

data ListMap k v = ListMap { ifEmpty :: Maybe v, ifFull :: Maybe k (ListMap k v) }

empty :: ListMap k v
empty = ListMap Nothing M.empty

singleton :: [k] -> v -> ListMap k v
singleton [] v = ListMap.empty { ifEmpty = Just v }
singleton (k:ks) v = ListMap.empty { ifFull = M.singleton k (ListMap.singleton ks v) }

lookup :: Ord k => [k] -> ListMap k v -> Maybe v
lookup [] lm = ifEmpty lm
lookup (k:ks) lm = M.lookup k (ifFull lm) >>= ListMap.lookup ks

insert :: Ord k => [k] -> v -> ListMap k v -> ListMap k v
insert [] v lm = lm { ifEmpty = Just v }
insert (k:ks) v lm = lm { ifFull = M.alter (Just . insertion) k (ifFull lm) }
  where insertion = maybe (ListMap.singleton ks v) (ListMap.insert ks v)

它本质上是在列表元素上创建一个前缀树,以便您只在必要时进行比较。

我怀疑使用向量(向量包)而不是列表作为关键将是一个巨大的胜利。啊,你是对的。我想我是错误地考虑了任意大数据的哈希冲突。谢谢