我有一系列我想要过滤的字符串。他们将采用这种模式:
xxx_xxx_xxx_xxx
所以总是由三个下划线分隔的一系列字母或数字。每个字符串的最大长度为60个字符。我的收藏中可能有几百万这些。
我可以使用哪种数据结构来高效地执行以下操作:
获取所有字符串以:“abc_123_456”
开头获取所有字符串以:“def_999_888”
开头等。
例如,我可以这样做:
List<String> matched = new ArrayList<String>();
for (String it : strings) {
if (it.startsWith(match)) {
matched.add(it);
}
}
但是如果我的收藏品是数百万字符串的数量,那将需要很长时间,如果匹配字符串的数量也很高,则会更糟。
高级别的问题是,我想回答以下问题:我正在撰写的应用程序:“我的哪位朋友推荐过产品B的产品?”。我可以将这些信息存储在sql表中并运行以下语句:
select recommender from recs where username='me' and prodIdA='a' and prodIdB='b';
我很好奇java / C / C ++中的自定义内容可以运行得更快,使用上面编码的扁平字符串:
myusername_prodIdA_prodIdB_recommenderusername
这个想法是你可以对整个编码字符串集合进行启动操作以获得答案。
我知道尝试实现这样的自定义解决方案很可能在生产环境中无法使用,所以有些sql db会更好,但只是好奇,
由于
答案 0 :(得分:2)
要在Java中执行此操作,您可以使用Trie结构。
话虽如此,我认为这不是一个好主意。将“几百万”记录倾倒在内存中并不总是有效。
这就是数据库的用途;通过正确的设计和正确的索引,您可以单独使用DB来获得非常好的性能。
答案 1 :(得分:0)
我认为你正在寻找一个SortedMap。
“headMap(K toKey) 返回此映射部分的视图,其键严格小于toKey。“
答案 2 :(得分:0)
我知道尝试实现这样的自定义解决方案很可能在生产环境中无法使用,所以有些sql db会更好,只是好奇但
如果只是为了好奇,可以将所有现有的不同“myusername_prodIdA_prodIdB”组合放在哈希表中。并为每个组合存储相关结果列表。
因此,结构看起来像Map<String, List<String>>
并像hash.get("def_999_888")
一样使用。恒定时间(O(1))
您可以通过多种方式摆脱内部列表并对其进行优化,但这是理念。
答案 3 :(得分:0)
我首先想到的是将字符串预处理成某种数据结构,以便有效地搜索它们。如果您要多次调用搜索函数,我认为将所有字符串放入哈希表以进行恒定查找是件好事。它需要更多的处理能力来构建你的字符串数组,但它会使搜索它们的任务变得无足轻重。