【问题标题】:Optimal implementation of a word finding android application [closed]单词查找android应用程序的最佳实现[关闭]
【发布时间】:2020-04-25 17:04:28
【问题描述】:

我正在开发一个解决以下问题的android应用程序:给定一个单词,例如'meat',找到所有由'meat'中的字符组成的英文单词,即'mate'、'tame'、'meta', “团队”和“肉”。

问题在于优化设计。当前的实现是这样工作的:

  1. 从 json 文件中获取 10,000 个英文单词的集合,并在应用安装时存储在 room sqlite 数据库中。
  2. 当用户搜索一个词时,会发生以下情况:

    1. 应用程序通过将用户输入的单词随机播放 5000 次(技术上为 5000 * 字长)创建一组所有可能的排列。
    2. 应用程序查询数据库以获取存储在单词表中的所有单词的列表。
    3. 应用程序将这两个集合相交以查找匹配项。

问题在于,当用户在真实设备上搜索单词时,应用程序会滞后。单词超过 6 个字母时,响应时间较长。

我正在寻找更好的方法。理想的解决方案必须以某种方式做到以下几点:

  1. 零延迟。应用程序不得在用户输入单词时出现延迟。
  2. 应用程序必须正常响应长词。

【问题讨论】:

  • “当单词超过 6 个字母时需要很长时间才能响应”——使用Android Studio's profilers 或简单的Log 调用来确定您将时间花在哪里。然后,确定您可以采取哪些措施来提高慢点的性能。如果您无法确定如何提高性能,请通过minimal reproducible example 提出单独的问题并寻求有关性能改进的帮助。

标签: java android kotlin set


【解决方案1】:
  1. 您可以编写函数 getHashForm(word: String),它必须返回相同的单词,但字母按照 ABC 排序。例如,“mate”、“tame”、“meta”这两个词都有相同的“hash-form” - “aemt”。
  2. 您可以在 sql 数据库中保存原始单词,还可以保存它们的“hash-form”(从 JSON 加载时,您必须借助“getHashForm”获取此 hash-form)。
  3. 当您在相似词中搜索“肉”时,您要做的第一件事是在“getHashForm”-“aemt”的帮助下获取它的“hash-form”。然后一次性查询您的数据库(仅在伪代码中使用“select * from your_table as yt where yt.hashform = :[hash_you_get]”),无需循环或改组。

【讨论】:

  • 谢谢。如何实现 getHashForm
  • 我已经找到了如何获取哈希值。 val hash = word.toList().sorted().hashCode()非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多