我试着理解mmo目标文件格式是如何工作的,这用于Don Knuth的教育MMIX架构.我没有买过MMIXware,所以我必须从汇编程序和模拟器的文字源文件中猜出大部分细节.
对象格式使用特殊的三元搜索trie来存储符号表.看看代码,我不太明白它是如何工作的.有人可以向我解释一些细节吗?特别是关于如何序列化树.
我已经看了这个问题,但我仍然没有看到后缀树和Trie之间的区别.
两者都具有给定字符串的所有子字符串,因此它们彼此之间有何不同?
我需要使用 Trie 搜索来实现 AutocompleteTextView。我正在使用一个 Vertex 类和一个 Trie 类作为 Trie 树数据结构,以及一个用于自定义 autocompleteTextView 下拉框视图的适配器。
以下是我正在使用的所有类:
顶点类:
public class Vertex {
private HashMap<Character, Vertex> vertexSons;
private List<Integer> wordsIndexList;
private List<Integer> prefixesIndexList;
private int wordsNumber;
private int prefixesNumber;
public Vertex() {
vertexSons = new HashMap<Character, Vertex>();
wordsIndexList = new ArrayList<Integer>();
prefixesIndexList = new ArrayList<Integer>();
wordsNumber = 0;
prefixesNumber = 0;
}
public boolean hasWords() {
if (wordsNumber > 0) {
return true;
}
return false;
}
public boolean hasPrefixes() {
if (prefixesNumber > 0) …Run Code Online (Sandbox Code Playgroud) 我一直在研究尝试并检查它们的优点和缺点。由于它们恒定的 O(m) 查找(其中 m 是字符串的长度)和其他优点(例如提供字符串的有序检索和获取公共前缀),它们在许多实际应用中非常有用,例如字典、拼写检查器等。所以,优点对我来说很清楚,但局限性有点令人困惑。
我正在关注此链接:https : //en.wikipedia.org/wiki/Trie
这里列出的缺点是:
后续问题- 为什么会有涉及二级存储的场景?不尝试也应该存储在主内存中。如果它们存储在二级存储中,那么无论如何都没有使用特里,因为磁盘访问总是会导致更多的时间。
后续问题:是否因为尝试将包含更多用于将每个字符连接到下一个字符的引用/指针,并且与将其存储为整个字符串相比会消耗更多字节?(我从这里的一个答案中得到了这个原因)。任何人都可以详细说明这一点吗?
我真的很感激这里的一些帮助。谢谢。
如何使用 trie(或其他数据结构或算法)通过前缀有效搜索多个单词?
例如:假设这是我的数据集:
trie 数据结构允许我有效地检索以“ Bo ”开头的所有名称(因此无需迭代所有名称)。但我还想按前缀搜索姓氏,因此搜索“ Wa ”应该找到“Bobby Walker”。让事情变得复杂的是:当用户搜索“ Bo Wa ”时,也应该找到相同的名字。我怎样才能实现这个?我应该为名称的每个部分使用单独的 trie 结构吗?(以及如何合并结果)?
背景:我正在为大型地址簿(10000 多个名称)编写搜索功能。我想要一个非常快速的自动完成功能,可以在人们输入名字和姓氏的前几个字母时显示结果。我已经有一个使用正则表达式的解决方案,但它需要迭代所有名称,这会很慢。
我在定期生成的特里中有一些统计数据。我想根据两次尝试之间的差异生成火焰图。我怎么做?
t = pygtrie.StringTrie(separator=os.path.sep)
for dirpath, unused_dirnames, filenames in os.walk(ROOT_DIR):
for filename in filenames:
filename = os.path.join(dirpath, filename)
try:
filestat = os.stat(filename)
except OSError:
continue
if stat.S_IFMT(filestat.st_mode) == stat.S_IFREG:
t[filename] = filestat.st_size
Run Code Online (Sandbox Code Playgroud) 以下是使用特里树对字符串进行排序的算法的描述:
该算法首先O(n)及时插入trie中的所有项目,其中n是要排序的单词列表中的字符总数。
然后它按顺序遍历树,当遇到is_end设置了标志的节点时,打印出一个以它的前缀开头的节点。这需要对特里树进行完整的遍历,这需要O(m)时间,其中 m 是特里树中的节点数。这以 为界n,因此这一步也以 为界O(n)。
整个算法由两个子程序组成,每个子程序以 为界O(n)。例如,如果我们说平均单词包含c字符,那么 ifm是单词数,cm == n,并且总运行时间受O(n) == O(cm) == O(m)(我将其更改为的原因m是因为这是要排序的列表长度的传统度量,不是字符总数)。
因此,我的问题是,如果这个运行时分析是正确的,为什么这不是字符串排序的默认方法,因为它比任何O(nlogn)排序算法都快?
我对使用try尝试的字符串匹配中使用的实际算法并不太精通.
我想知道为什么似乎更关注字符串匹配的后缀尝试而不是前缀尝试.我们可以不使用前缀尝试进行子串匹配吗?换句话说,后缀尝试超过前缀尝试的优点是什么?
给定一组字符串(大集合)和输入字符串,您需要有效地找到输入字符串的所有字符.您将使用什么数据结构.使用它,你会如何找到字谜?
我想到的是这些:
使用地图
a)消除所有字母多于/少于输入的字母.
b)将输入字符放在地图中
c)遍历每个字符串的地图,看看是否所有字母都带有计数.
使用尝试
a)将所有具有正确字符数的字符串放入trie中.
b)遍历每个分支,如果输入中包含字母,则更深入.
c)如果叶子到达这个词是一个字谜
有人能找到更好的解决方案吗?
您在上述方法中发现了哪些问题?
如果我有键到值的映射,那么键组可以实现为固定虚拟值的键映射.
傻瓜有很多候选人:
data- 没有构造函数的定义类型forall a . a)对我来说最明显的解决方案是使用股票单例类型,()但case我可以区分()底部,所以我认为内存表示()包括间接.
我有两个问题:
Map.fromList [(1, ()), (2, ())]会比更多的内存let dummy = () in Map.fromList [(1, dummy), (2, dummy)]?dummy构建集合的值是多少?