Erlang:这个 trie 实现最错误的地方是什么?

2023-12-28

假期里,我的家人喜欢玩Boggle。问题是,我的Boggle 技术很糟糕。所以我做了任何优秀程序员都会做的事情:编写一个程序来给我玩。

该算法的核心是一个简单的前缀特里树 http://en.wikipedia.org/wiki/Trie,其中每个节点是一个dict下一个字母的参考文献。

这是trie:add执行:


add([], Trie) ->
    dict:store(stop, true, Trie);

add([Ch|Rest], Trie) ->
    % setdefault(Key, Default, Dict) ->
    %     case dict:find(Key, Dict) of
    %         { ok, Val } -> { Dict, Val }
    %         error -> { dict:new(), Default }
    %     end.
    { NewTrie, SubTrie } = setdefault(Ch, dict:new(), Trie),
    NewSubTrie = add(Rest, SubTrie),
    dict:store(Ch, NewSubTrie, NewTrie).  

您可以在此处查看其余部分以及如何使用它的示例(在底部):

http://gist.github.com/263513 http://gist.github.com/263513

现在,这是我在 Erlang 中的第一个严肃的程序,我知道它可能有很多问题......但我最关心的是它使用800 MB 内存.

那么,我做的最错的是什么?我怎样才能让它少一点错误呢?


您可以通过简单地将单词存储在 ets 表中来实现此功能:

% create table; add words
> ets:new(words, [named_table, set]).
> ets:insert(words, [{"zed"}]).  
> ets:insert(words, [{"zebra"}]).    

% check if word exists
> ets:lookup(words, "zed").          
[{"zed"}]

% check if "ze" has a continuation among the words
78> ets:match(words, {"ze" ++ '$1'}).
[["d"],["bra"]]

如果 trie 是必须的,但您可以接受非功能性方法,那么您可以尝试digraph http://www.erlang.org/doc/man/digraph.htmls,正如保罗已经建议的那样。

如果您想保持功能正常,您可以通过使用使用较少内存的结构来节省一些字节的内存,例如proplist http://www.erlang.org/doc/man/proplists.htmls,或记录,例如-record(node, {a,b,....,x,y,z}).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Erlang:这个 trie 实现最错误的地方是什么? 的相关文章

  • 接收缓冲区的限制

    我通过以下方式与客户端建立了连接 gen tcp listen 1234 binary packet 0 reuseaddr true active false recbuf 2048 此代码执行消息处理 loop Socket gt in
  • erlang - 如何将元组内容与 qlc 和 mnesia 匹配?

    我有一个记录该记录的记忆表 record peer peer key key is the tuple FileId PeerId last seen last event uploaded 0 downloaded 0 left 0 ip
  • Erlang:如何在控制Erlang进程崩溃时使连接的外部操作系统进程自动终止?

    我正在使用 Erlang 端口读取 Linux 进程的输出 我希望每当我连接的 Erlang 进程终止时 Linux 进程就会自动终止 从文档来看 在我看来这应该自动发生 但事实并非如此 最小的例子 将其放入文件 test erl 中 mo
  • Erlang中socket的“packet”选项怎么能如此加速tcp传输呢?

    使用 packet 4 通过本地主机上的两个不同端口传输1G数据只需要8秒 而使用 packet raw 则无法在30秒内完成相同的任务 我知道如果使用后一种方法 数据将以数万个小块的形式到达 在archlinux上大小为1460字节 我已
  • Mnesia 返回 {aborted, no_transaction}

    我有一个名为 Mnesia 的表person 使用以下记录定义 record person id firstname lastname phone 该表包含以下值 12 alen dumas 97888888 13 franco mocci
  • 选择用于实现分布式消息传递算法的编程语言

    基本上 我想实现以下算法并分析使用这些算法构建的系统在不同条件下的行为 八卦协议 多个paxos 一致的散列 我的兴趣在于这些算法 我基本上是在寻找一种编程语言 可以让我快速编写这些算法并深入理解这些算法 我应该选择哪种语言 Java Sc
  • 具有大状态的 erlang gen_server

    我有一个包含数千个条目的特里树 用元组和列表实现 我想支持并发读取 数据的内存占用量在 10 20 MB 范围内 特里树被构建一次 之后只读 维护状态并为客户端提供并发访问的推荐方法是什么 这是我尝试过的 1 创建一个gen server
  • Erlang 代码的持续集成服务器

    您使用什么类型的敏捷工具进行 Erlang 开发 什么持续集成 http en wikipedia org wiki Continuous integration您使用 CI 服务器来构建 Erlang 代码吗 我得到的唯一参考来自 Quo
  • erlang中如何将中缀转换为后缀?

    我刚刚遇到这个帖子 https stackoverflow com questions 4621151 the shortest way to convert infix expressions to postfix rpn in c 相当
  • 如何在 Erlang 中将 XML 转换为元组列表?

    我正在尝试从 XML 创建键 值对元组 我想从任何嵌套的 XML 中列出一个列表 这似乎是一件很常见的事情 但我找不到任何例子 例如
  • Erlang:NIF 和透析器警告

    在实施 NIF 时 Dialyzer 给了我 函数 crc16 1 没有本地返回 可能是因为我这样做exit在 erl 模块中 如官方文档推荐 module my nifs export crc16 1 on load init 0 ini
  • 加密 (cryptojs) - 解密 (erlang)

    我有一个使用 cryptoJS AES 加密的值 需要使用 Erlang 加密库进行解密 对我来说问题在于能够在 Erlang 中使用解密aes cbc 128 decrypt Key IVec Cipher 我想 我需要知道使用的 IVe
  • 随机排列列表中的元素(随机重新排列列表元素)

    我的程序的一部分要求我能够随机洗牌列表元素 我需要一个函数 当我给它一个列表时 它会伪随机地重新排列列表中的元素 安排的改变Must每次通话时都可以看到相同的列表 我的实现似乎工作得很好 但我觉得它相当长 并且正在增加我的代码库 而且 我有
  • Erlang 中的二进制和位串有什么区别?

    在 Erlang shell 中 我可以执行以下操作 A 300 300 lt
  • RabbitMQ 失败,错误:无法连接到节点rabbit@TPAJ05421843:nodedown

    在 Windows 7 Enterprise 计算机上 我全新安装了 Erlang 17 4 和 RabbitMQ 3 4 3 x64 安装成功且顺利 我还没有尝试创建我的第一个队列或交换器 但我已经看到了麻烦 这个问题类似于另一个SO帖子
  • ejabberd 和 Erlang 安装,lager_transform 未定义

    我是 Erlang 新手 我一直在尝试在 EC2 ubuntu 机器上安装 Erlang 和 ejabberd 一切都很顺利 直到我开始编译一些外部模块ejabberd 它开始抛出错误undefined parse transform la
  • 终止连接到 erlang 端口的进程

    我想写一个某种主管 我正在尝试实现关闭外部程序的功能 外部进程通过端口连接到 erlang 的代码 我不知道如何通过发送信号或其他任何方式来关闭该程序 关闭端口不是解决方案 因为我已经检查过许多程序不会在 SIGPIPE 上退出 您有任何想
  • 我们如何有效地处理 mnesia 记录的时间相关约束?

    我正在将记录写入mnesia 该记录应该保存在那里 仅在允许的时间 24 小时 内 24小时后 在用户修改其中的一部分之前 系统应该自动删除它们 例如 用户获得免费通话时间 用于语音通话 他们应该在给定时间内使用它们 如果他们不使用它 24
  • Erlang 如何并发处理访问邮箱

    关于如何使用erlang邮箱的信息有很多 但很少找到一篇论文或文档描述erlang如何在VM内部同时实际访问邮箱 据我了解 Erlang VM 必须执行锁定或 CAS 操作以确保消息完整性 erlang幕后有没有什么精巧的方法 我假设您所说
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101

随机推荐