SML中快速Fifo的实现

SML中快速Fifo的实现,sml,mutable,smlnj,Sml,Mutable,Smlnj,是否可以实现Fifo,支持其功能的子集,即仅使用某种可变指针,使用通用'a对象初始化空,使用某种可变指针,因此,在当前两个列表实现使用的特定时间复制一个列表不会产生任何成本(当复杂度被摊销时,不会产生任何成本,因为它仍然是O(1)摊销的操作成本,但对于我的一个应用程序来说仍然不足),如果是的话,具体如何执行?您可以使用,这也会产生摊销成本,或者您可以使用ref和选项类型来实现。我已经链接到C解决方案,因为这些解决方案是类似的,尽管在SML中语法更复杂,因为我在SML中找不到任何示例。当每个节点装

是否可以实现Fifo,支持其功能的子集,即仅使用某种可变指针,使用通用
'a
对象初始化
,使用某种可变指针,因此,在当前两个列表实现使用的特定时间复制一个列表不会产生任何成本(当复杂度被摊销时,不会产生任何成本,因为它仍然是O(1)摊销的操作成本,但对于我的一个应用程序来说仍然不足),如果是的话,具体如何执行?

您可以使用,这也会产生摊销成本,或者您可以使用
ref
选项
类型来实现。我已经链接到C解决方案,因为这些解决方案是类似的,尽管在SML中语法更复杂,因为我在SML中找不到任何示例。当每个节点装箱时,双链表解决方案将产生内存开销,但不会产生动态数组解决方案或您描述的全功能deque的摊余成本

功能性双端队列一直是研究的热点;中有一些关于几种数据结构和方法的参考资料,这些数据结构和方法都依赖于惰性,而不是惰性。我不知道其中任何一个是O(1);看起来它们要么是O(1)摊销,要么是O(lgn),但仍然有效

以下是非功能性双链表数据类型的外观:

datatype 'a node = Node of { elem : 'a
                           , prev : 'a node option ref
                           , next : 'a node option ref
                           }

datatype 'a deque = Empty | NonEmpty of 'a node
这样的实施有一些缺点:

  • 跟踪引用在语法上并不好。你可以用C写

    if (nd->prev) nd->prev->next = nd;
    
    但在SML中,这看起来更加模糊,除非您定义了一组用于获取和设置上一个/下一个节点的辅助函数。即使这样做,因为引用并不常用,所以getter和setter看起来也不像C的指针语法那样是非标准的

  • 你在发明空指针。实现本身是脆弱的,因为您可能会遇到这样的情况:前一个/下一个节点引用了
    NONE
    ,而不应该引用它。操作不会超出推送、弹出、移位和取消移位的范围,因此当您完成这些操作后,您可以依赖测试(基于单元或属性)。我想说,你绝对必须测试这一点,而不是购买ML通常利用的优势

  • 您的队列是可变的,因此现在您必须小心传递队列的位置。如果您对队列的使用进入了中断状态,那么您就无法很容易地找到导致它的源。你基本上是在用更难看的语法编写C

因此,简单的回答是:您肯定可以编写相同的实现,但语言不鼓励这样做,函数式程序员通常依赖于具有对数或摊销运行时间的不可变数据结构。

您可以使用an for a,这也会产生摊销成本,或者可以使用
ref
选项
类型来实现。我已经链接到C解决方案,因为这些解决方案是类似的,尽管在SML中语法更复杂,因为我在SML中找不到任何示例。当每个节点装箱时,双链表解决方案将产生内存开销,但不会产生动态数组解决方案或您描述的全功能deque的摊余成本

功能性双端队列一直是研究的热点;中有一些关于几种数据结构和方法的参考资料,这些数据结构和方法都依赖于惰性,而不是惰性。我不知道其中任何一个是O(1);看起来它们要么是O(1)摊销,要么是O(lgn),但仍然有效

以下是非功能性双链表数据类型的外观:

datatype 'a node = Node of { elem : 'a
                           , prev : 'a node option ref
                           , next : 'a node option ref
                           }

datatype 'a deque = Empty | NonEmpty of 'a node
这样的实施有一些缺点:

  • 跟踪引用在语法上并不好。你可以用C写

    if (nd->prev) nd->prev->next = nd;
    
    但在SML中,这看起来更加模糊,除非您定义了一组用于获取和设置上一个/下一个节点的辅助函数。即使这样做,因为引用并不常用,所以getter和setter看起来也不像C的指针语法那样是非标准的

  • 你在发明空指针。实现本身是脆弱的,因为您可能会遇到这样的情况:前一个/下一个节点引用了
    NONE
    ,而不应该引用它。操作不会超出推送、弹出、移位和取消移位的范围,因此当您完成这些操作后,您可以依赖测试(基于单元或属性)。我想说,你绝对必须测试这一点,而不是购买ML通常利用的优势

  • 您的队列是可变的,因此现在您必须小心传递队列的位置。如果您对队列的使用进入了中断状态,那么您就无法很容易地找到导致它的源。你基本上是在用更难看的语法编写C


因此,简短的回答是:您肯定可以编写相同的实现,但语言不鼓励这样做,函数式程序员通常依赖于具有对数或摊销运行时间的不可变数据结构。

在我看来,这些与正常的FIFO操作类似,而不是子集。在我看来,这些看起来像正常的FIFO操作,而不是子集。