2015-08-22 43 views
2

我正在制作一个程序,而我以为使用的算法需要一种廉价的方式来访问列表以使其有效。有没有一种有效的方法来访问最后一个元素的列表?或者,因为我认为这可能是不可能的,因为SML列表的结构,是否有一个有效的数据结构来实现它?SML/NJ - 有效的方法或数据结构从头开始访问开始

数据的长度在执行之前是未知的,除了串行遍历数据外,不需要其他数据。

+0

你必须留下一些东西,因为你为什么不能重新定义前面作为后面,并向前访问呢? – newacct

+0

我希望能够从后面访问列表,同时仍然能够从正面访问它 - 用几句话,我想要双向访问。理论上,双向链表将是完美的。 –

回答

0

如果使用功能性deque看起来像是矫枉过正,并且您只需要以相反顺序遍历列表一次,那么解决方案(例如,使用List.lastList.take来模拟hdtl,但是按照您看起来知道的那样,倒序是相反的,因为它们会使列表遍历为二次方。另一方面,内置函数rev非常高效,因为它既是尾递归又是线性的。如果您向需要以相反顺序遍历该列表的函数提供列表,则一个简单的解决方案是使用let使用rev进行绑定,以相反顺序创建列表的本地副本,然后以常规方式遍历反向列表。

+0

我的确记住了这些,但会连续读取不同的列表,并且连续的反转会太慢。另一方面,使用功能性deque确实是过度的,所以我想出了一个新的算法:P但是了解功能性dequeues使得这个问题值得。 –