jjzjj

java - 如何在大型单词列表(词汇表)中查找具有下降内存消耗和查找时间的单词?

coder 2023-06-04 原文

问题

[下面是应用程序在受限条件下的操作说明]

我想要一个数据结构来搜索25万个单词列表中是否存在string,同时仅使用相当数量的ram并保持将数据结构加载到ram中所需的时间很小(比如说0到8秒) 。查找单词所需的时间也应该很快(比如说0到0.5秒),但是ram的使用更为重要。还可以创建多个游戏(在标题“使用”中更多有关该游戏的内容),而无需占用大量内存。

知道哪些单词以string开头也非常有值(value),但不足以牺牲很多秒的加载时间。

采用

适用于Android离线游戏。有限的内存可用。 The maximum amount of ram an Application can use according to this post is between 16-32mb ram depending on the device.我的空Android应用程序已经使用了大约17mb(使用Android Studio中的Memory Monitor)。我的android设备将ram的使用上限限制为26mb,而整个Activity则为我留出了大约8mb的可用空间。

我尝试过的选项

他们似乎都以不同的方式注定了失败。

  • 哈希图-将所有单词读入哈希图对象。

    1.1 初始化速度:慢,需要23秒才能将每个单词读入哈希表。

    1.2 ram用法:使用了大量的ram,尽管我忘记了多少。

    1.3 搜索速度:当然,快速查找列表中是否存在单词。

    1.4 缩小可能的单词范围(可选):较慢,需要遍历整个哈希图并逐一删除它们。另外,由于它使用的是删除功能,因此无法使用哈希图的相同实例来玩多个游戏。添加更多游戏时会占用太多内存,从而无法缩小可能的单词数。
  • Trie - Implement a RadixTree
    You can see my implementation here.

    2.1 初始化速度:慢,需要47秒才能将每个单词读入RadixTree。

    2.2 ram用法:使用大量的ram,以至于Android多次挂起线程。

    2.3 搜索速度:快速查找列表中是否存在单词。

    2.4 缩小可能单词的范围(可选):超快速,因为只需要引用树中的一个节点即可找到所有可能的单词作为其子代。您可以通过缩小可能的单词来玩很多游戏,因为额外的游戏只需要引用树中的一个节点即可!
  • 扫描仪-按顺序浏览单词文件

    3.1 初始化速度:无。

    3.2 ram用法:无。

    3.3 搜索速度:大约20秒。

    3.4 缩小可能的单词的范围(可选):无法现实地完成。

  • 简单的代码:
    String word;
    String wordToFind = "example";
    boolean foundWord = false;
    
    while (wordFile.hasNextLine()) {
        word = wordFile.nextLine();
        if(word.equals(wordToFind)) {
            foundWord = true;
            break;
        }
    }
    
    test.close();
    

    我想到的选项:
  • Long-binary-search-tree: Converting the word-list to a list of long s then reading these in and doing a binary search on them.

    1.1 的初始化速度:可能与哈希图相同或略微,大约需要20秒。但是我希望调用Array.sort()不会花费太多时间,到目前为止还不知道。

    1.2 ram用法:如果仅使用12个字母单词或更低的字母和26个字母的字母,则需要5位(2 ^ 5 = 32)来编码字符串。那么一个long数组将需要250,000 * 8位=大约2mb。哪个不算太多。

    1.3 搜索速度: Arrays.binarySearch()

    1.4 缩小可能的单词(可选):缩小可能的单词是可能的,但我不确定如何缩小。 According to a comment on this post
  • 带有存储的哈希图-创建一个将单词映射到单词列表文件的索引号的哈希函数。然后在此特定位置访问文件,并从此处查找是否存在单词。您可以利用字母的顺序来确定是否仍然可以找到该单词,因为单词列表是自然排列的。

    2.1 初始化速度:不需要(因为我需要事先将每个单词放在正确的索引处。)

    2.2 ram用法:无。

    2.3 搜索速度:很快。

    2.4 缩小可能的单词范围(可选):不可能。


  • 我有具体问题
  • 我在“我想到的选项”部分中考虑过的选项是否可行,或者是否还有我错过的事情而无法实现?
  • 是否有我没有想到过的选项在性能上更好/相等?

  • 结束语

    我已经在这个问题上停留了大约一个星期。因此,任何新想法都将受到欢迎。如果以上任何假设不正确,我也很高兴听到有关它们的信息。

    我以这种方式发布了这篇文章,以便其他人也可以从他们那里学习,无论是看到我的错误还是看到答案中有什么用。

    最佳答案

    这听起来像是bloom filter的理想用法。如果您愿意冒被误认为某个单词的风险,则可以将单词表压缩为您愿意制作的大小一样大的内存。

    关于java - 如何在大型单词列表(词汇表)中查找具有下降内存消耗和查找时间的单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29918587/

    有关java - 如何在大型单词列表(词汇表)中查找具有下降内存消耗和查找时间的单词?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    6. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    7. ruby - RVM 使用列表[0] - 2

      是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

    8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    9. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

      我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

    10. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    随机推荐