List 从列表创建一个随机堆

List 从列表创建一个随机堆,list,haskell,heap,List,Haskell,Heap,我在haskell atm机上读大学,我被困在这里了。数据类型如下所示: data Heap a = Empty | Node a (Heap a) (Heap a) (在本练习中,Heapa始终是一个最小-最大堆,因此树中偶数级别的每个节点都小于其所有后代,而树中奇数级别的每个节点都大于其所有后代) 问题是: “randomHeap::[a]->IO(Heap a),它生成一个随机堆,包含参数列表中的所有元素 “使用函数randomRIO::Random t=>(t,t)->IO t(该函数

我在haskell atm机上读大学,我被困在这里了。数据类型如下所示:

data Heap a = Empty | Node a (Heap a) (Heap a)
(在本练习中,
Heap
a始终是一个最小-最大堆,因此树中偶数级别的每个节点都小于其所有后代,而树中奇数级别的每个节点都大于其所有后代)

问题是:

randomHeap::[a]->IO(Heap a)
,它生成一个随机堆,包含参数列表中的所有元素

“使用函数
randomRIO::Random t=>(t,t)->IO t
(该函数存在于
System.Random
)来计算特定范围内的随机值

请注意,对于非空列表,根元素的选择是唯一的,不同的是用于构建子树的元素


我将假设堆将从所有可能性中均匀随机地选择。让我们研究具有
n
节点的可能最小最大堆的数量
f(n)
。唯一确定的节点位于根节点,在这方面没有选择。我们选择左侧剩余节点的子集,然后对两个子节点重复此操作
f(n+1)=和{k=0}^{n}{(n/k)*f(k)*f(n-k)};f(0)=0
。前几个术语是1、1、2、6、24和120,这表示阶乘序列(序列相等的证明是儿童游戏),它还描述了输入列表中可能的顺序数。因此,我们希望每个列表顺序对应一个最小-最大堆


经过几分钟的思考,现在看起来很明显,在洗牌列表之后,我们可以在其最小元素处拆分它,选择列表中最小元素左侧的部分作为所提到的子集,然后在最大元素处拆分每一半,然后在最小元素处拆分每四分之一,依此类推。不同的列表顺序产生不同的堆,因此这种有限的对应关系是一对一的。

您可能对堆的定义感到困惑


必须根据堆的类型选择根,根是参数的max/min元素。然后使用randomRIO选择哪些元素进入每个节点。

我的想法是:使用randomRIO from(0,30)生成一个列表,通过一个函数接收lnt(这是要生成的列表的长度),然后我的问题是将生成的(排序的)列表放入堆中。也许我的问题只是语法问题。你的问题到底是什么?你问的问题一点也不清楚。今天晚些时候我会尝试实施,我会给出反馈谢谢!他特别指出,堆是一个最小-最大堆。看见