Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 手指树(Data.Sequence)与Rope(Data.Rope)(Haskell或一般)_Performance_Haskell_Data Structures_Sequence - Fatal编程技术网

Performance 手指树(Data.Sequence)与Rope(Data.Rope)(Haskell或一般)

Performance 手指树(Data.Sequence)与Rope(Data.Rope)(Haskell或一般),performance,haskell,data-structures,sequence,Performance,Haskell,Data Structures,Sequence,a和Rope(Data.Rope)(或)之间的关键区别是什么 在Haskell库中,Data.Sequence有更多的函数。我认为rope处理“块”的效率更高 作为一名程序员,我考虑过处理700万字符序列的效率,我需要(a)在任何地方插入,(b)剪切和粘贴段(拼接),(c)搜索和替换子字符串,哪一种效率更高 针对ehird的澄清: 我的算法的大部分运行着数千个搜索替换操作,比如s/(ome)?reg[3]x/blah$1/g,以重复变异数据。因此我需要高效的正则表达式模式匹配(可能是形式?以及拼

a和Rope(Data.Rope)(或)之间的关键区别是什么

在Haskell库中,Data.Sequence有更多的函数。我认为rope处理“块”的效率更高

作为一名程序员,我考虑过处理700万字符序列的效率,我需要(a)在任何地方插入,(b)剪切和粘贴段(拼接),(c)搜索和替换子字符串,哪一种效率更高

针对ehird的澄清:

  • 我的算法的大部分运行着数千个搜索替换操作,比如
    s/(ome)?reg[3]x/blah$1/g
    ,以重复变异数据。因此我需要高效的正则表达式模式匹配(可能是形式?以及拼接(数据[a:b]=newData),其中不一定
    (长度(newData)=b-a+1)

  • 惰性ByteString可能还可以,但是拼接呢?拼接ByteString是O(数据大小/块大小)线性时间(用于搜索),加上(可能?)维护恒定大小块的开销(后一部分可能是错误的);而对于FingerTree则是O(日志(数据大小))

  • 我的“containee”数据类型在抽象上是一个有限的字母表。它可以具体地表示为
    Char
    s或
    Byte
    s或
    Word8
    s,甚至类似于假设的
    Word4
    s(半字节)。 **我有一个相关的问题,关于如何有效地使用
    newtype
    数据
    ,以便我的代码可以引用抽象字母表,但编译的程序仍然可以有效。(我应该单独发布这个问题。)

  • 性能问题:Seq可能比ByteString差得多(按q显著常数因子)。在简单测试中,将7MB数据读入严格的
    ByteString
    ,然后以60MB实际内存使用率打印到控制台峰值(根据Windows Process Manager),但将该内容加载到
    Seq Char
    中,然后打印需要400MB!(我应该单独发布这个问题,并附带代码和分析细节。)

  • 平台问题:我正在使用和Haskell平台。我的机器上安装了文本,我想尝试一下,但我的Eclipse环境找不到它。每当我使用
    cabal安装
    (安装了不兼容版本的软件包,
    --user
    vs
    --global
    混乱),所以我想继续使用EclipseFP可以找到的平台软件包。我认为下一个版本的平台会有文本,所以这会很好

  • Trifecta:我简单地看到了Trifecta,这增加了我的困惑。(为什么它已经发布了自己的通用数据结构的新实现?它们更好吗?几乎相同的选项太多了!)

  • 编辑了更多的细节和改进的链接

    这个问题变得很严重。 @ehird的总结是主要的要点。Rope,或者bytestring或Vectors的手指树加上一个小的自定义幺半群。不管怎样,我都必须编写一个简单的正则表达式实现来粘合

    考虑到所有这些信息,我建议使用绳索或建筑 您自己的结构和它所基于的fingertree包(而不是 而不是Seq,这样您就可以使用 测量的类型类(参见幺半群和指形树),带有叶 数据分块到一个未绑定的向量中。当然,后者更重要 工作,但让您特别针对您的用例进行优化。无论哪种方式, 一定要用一个抽象的界面来包装它

    今天晚些时候我会回来,分为几个新问题。我会把低级技术问题整理出来,然后再回到总体比较。
    我将更改问题标题,以更好地反映我真正关心的问题“哪些Haskell模块有效地提供或支持我需要的序列操作?”谢谢EHRD和其他响应者。

    < p>对于这个回答的其余部分,我假设你实际上是在存储原始字节,而不是字符。如果你想存储字符,那么你应该考虑使用Unicode文本的等效代码<代码> ByTeStord。或者在此基础上编写您自己的基于fingertree的结构。您也可以将
    ByteString
    与软件包中的模块一起使用;我认为这可能会更有效,但对于Unicode文本,它的功能远不如
    Text
    充分

    您链接的rope包只存储与
    ByteString
    s等效的数据,而
    Seq
    是通用的,可以处理任何类型的数据;前者可能更有效地存储字节字符串

    我怀疑这是相同的基本树结构,因为rope实现了“bytestrings的fingertrees”,而
    Seq
    是一个2-3个finger树;它取决于包,本质上与Data.Sequence相同,但更一般。很可能是rope通过testring将数据打包成short
    ByteString
    s,这是使用
    Seq
    无法实现的(如果不中断
    length
    等操作)

    总而言之,如果您存储字节字符串数据,rope似乎是一种更好的结构,它似乎具有“注释”字符串段的奇特功能;然而,它最后一次更新是在7月,新的解析器组合器库是由同一位作者编写的(首次发布于8月)包含其,因此在其基础上创建新代码可能是不明智的。当然,对trifecta所做的更改可能与一般用途无关,并且将这些更改拆分为新版本的rope可能不会太困难;可能它们没有被拆分的唯一原因是因为trifecta已经有大量依赖项:)

    但是,如果您在处理过程中的任何时候都需要通用容器类型