Arrays 纯功能范式中的数据结构

Arrays 纯功能范式中的数据结构,arrays,algorithm,data-structures,functional-programming,Arrays,Algorithm,Data Structures,Functional Programming,我有一些算法和数据结构方面的背景知识。我也花了一些时间以面向对象和程序的方式编写程序(使用C、C++、java等),但是功能性思维方式对我来说是全新的。 几乎每个程序都使用经典的数据结构,如数组(实心内存)、列表(内存块,通过指针连接)、集合(基于哈希表或树状结构)、映射(基于哈希表或树状结构) 我发现纯功能环境在这6种经典数据结构中只有3种类型:列表、集合(基于树)、映射(基于树)。我知道,有些函数式语言实际上有可变数组,甚至可以设置和映射(基于哈希表),但我说的是纯函数式方法 嗯,可能是缺少

我有一些算法和数据结构方面的背景知识。我也花了一些时间以面向对象和程序的方式编写程序(使用C、C++、java等),但是功能性思维方式对我来说是全新的。 几乎每个程序都使用经典的数据结构,如数组(实心内存)、列表(内存块,通过指针连接)、集合(基于哈希表或树状结构)、映射(基于哈希表或树状结构)

我发现纯功能环境在这6种经典数据结构中只有3种类型:列表、集合(基于树)、映射(基于树)。我知道,有些函数式语言实际上有可变数组,甚至可以设置和映射(基于哈希表),但我说的是纯函数式方法

嗯,可能是缺少基于散列的集合/映射不是很明显,但是如果没有我的好的可变数组,我会觉得很不舒服。考虑一个例子:

假设我有一个成对的列表((1,3)(2,2)(1,4)(2,1)(0,9)…),其中每一对都是(背包号,物品的重量)-基本上每一对都与物品相关联,物品必须放在特定的背包中(所有背包都被列举),并且它有一定的重量。在此基础上,我想得到一个成对的列表((0,27)(1,33)(2,18)…)-其中每对都是(背包号,背包中物品的总重量)

如果我能够使用可变数组,我就可以很容易地在传入列表上迭代一次,从而得到一个非常有效的成对数组。 但我在纯功能环境中没有可变数组。那么,我能想出什么样的最佳解决方案?
(到目前为止,我想到的最好的事情是通过使用0、1、2……作为键来模拟使用不可变映射的数组,当我在纯功能环境中需要数组时,这是一种方法吗?

请参阅一些非常相关的讨论(可能甚至相关到可以将其标记为副本)。这就是说:在这种特殊情况下,即使是不可变数组也足以匹配破坏性算法的渐近性。尽管我相信在大多数语言中,即使是不可变数组(尽管它们是纯数组),也通常作为语言实现的一部分提供,而不仅仅是作为库提供。如果要使用可变数组,您如何知道它的大小?如果背包的号码很少呢?当然,也有解决办法,但你可以通过简单地选择地图来避免整个问题。@ Bergi,我考虑的情况是,当我提前知道袋子总量时,它们是从0到n列举的。事实上,这并不是一个捏造的例子,因为当我试图为多背包问题编写一个蛮力解决方案时,它就出现了。计划中。如果可以的话,我不想向麻雀开火,而是使用比地图更适合的数组。对于固定大小的数组,您可以使用完整的m元树,其中在每个级别上都有低级别节点的m元组,最低级别上有数组中的项。对于大小为N的数组,您将需要log_m(N)级别。替换一个项意味着在每个级别分配一个新节点,其中每个节点都需要k个km字节,因此替换所需的总分配为km*log_m(N)=log(N)*km/log(m)。显然,更新阵列需要O(log(N))个时间。此外,当m/log(m)最小化时,开销也最小化。这在m=e时发生,所以2或3将是最好的。它们很接近,但是3个稍微好一点,如果考虑到每个对象额外的开销,在很多情况下4个可能会赢。