【发布时间】:2019-03-04 22:06:37
【问题描述】:
我正在开发一个应用程序,该应用程序接受语音输入,并将该输入与清单中的已知项目进行匹配。
清单中的每个项目都有一个别名列表,因此具有长标题的项目可以匹配到较短的名称。
例如:
class Product
{
itemname: "Old Stinky's Western Kentucky Big Rig Polish",
aliases: ["old stinky", "other alias"]
}
然后加载到内存中为:
public List<Product> Collection;
Collection.Add(alltheproducts);
然后匹配通过:
public String isProductOrAlias(String lowertext)
for (Product p: products.Collection) {
if(lowertext.equals(p.name.toLowerCase()))
return p.name;
if(p.aliases != null) {
for (String s: p.aliases) {
if(lowertext.equals(s.toLowerCase()))
return p.name;
}
}
}
这在原型中的 25 个测试批次中效果很好,但最终需要在手机上尽可能接近实时地处理 5,000-10,000 个项目。
核心问题:
假设我可以在内存中保存 10,000 个这些项目(样本时钟大约为 64 KB,因此 10,000 个项目总共不到 1 MB),在 android 上使用什么来将这些对象存储在内存中的最佳集合是,用数据填充该对象然后找到匹配元素的最快方法是什么?
【问题讨论】:
-
@MorrisonChang 我看过很多帖子引用 Trie 或 HashSet 甚至 Set,但它们似乎都是针对字符串的平面列表。有了这里的层次结构,我希望某种 lambda 表达式匹配得最快,但我不确定它是什么样子。
-
如果没有关于您的数据集及其搜索方式的更多信息(即为什么不首先使用别名,因为输入来自语音),除了尝试一些、测试和然后在尽可能接近的生产环境中检查和测量性能。快速执行通常意味着在内存(索引)或预处理时间(即离线构建 trie 并在应用启动时加载)方面进行一些其他权衡。
-
Lambda 表达式对速度没有任何帮助,因为它们主要是一个句法特性。您需要的是
Map以便快速查找。
标签: java android performance kotlin