草庐IT

java - 存储具有低内存占用 + 快速查找的大型字典的方法(在 Android 上)

coder 2023-05-18 原文

我正在开发一个安卓文字游戏应用程序,该应用程序需要一个大型(约 250,000 个单词字典)可用。我需要:

  • 相当快速的查找,例如固定时间更可取,有时需要每秒进行 200 次查找来解决单词拼图,并且可能需要在 0.2 秒内更频繁地进行 20 次查找来检查用户刚刚拼写的单词。

编辑:查找通常会询问“在字典中吗?”。我也想在单词中支持最多两个通配符,但这很容易,只需生成通配符可能是的所有可能字母并检查生成的单词(即 26 * 26 查找带有两个通配符的单词) .

  • 因为它是一个移动应用程序,所以使用尽可能少的内存并且只需要对字典数据进行少量初始下载是重中之重。

我第一次天真的尝试使用了 Java 的 HashMap 类,这导致了内存不足的异常。我已经研究过使用 android 上可用的 SQL lite 数据库,但这似乎有点矫枉过正。

什么是做我需要的好方法?

最佳答案

你也可以用更简单的方法来实现你的目标......如果这是一个文字游戏,那么我怀疑你正在处理 27 个字母的字母表。所以假设一个不超过 32 个字母的字母表,即每个字母 5 位。您可以使用 5 位/字母的普通编码将 12 个字母(12 x 5 = 60 位)塞进单个 Java long

这意味着实际上,如果您的单词长度不超过 12 个字母/单词,您可以将您的字典表示为一组 Java long。如果您有 250,000 字,则将这个集合简单地表示为单个、排序的 long 数组应该占用 250,000 字 x 8 字节/字 = 2,000,000 ~ 2MB 内存。然后通过二分搜索进行查找,考虑到数据集的小规模,这应该非常快(少于 20 次比较,因为 2^20 会将您带到一百万以上)。

如果您的单词长度超过 12 个字母,那么 I 会将 >12 个字母的单词存储在另一个数组中,其中 1 个单词会以明显的方式由 2 个连接的 Java long 表示。

注意:这种方法之所以有效并且可能比 trie 更节省空间并且至少实现起来非常简单,是因为字典是恒定的……如果您需要修改数据集,搜索树是很好的选择,但是如果数据集是常量,通常可以通过简单的二分查找来运行。

关于java - 存储具有低内存占用 + 快速查找的大型字典的方法(在 Android 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276641/

有关java - 存储具有低内存占用 + 快速查找的大型字典的方法(在 Android 上)的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. 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

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. 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/

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐