我想知道底层数据结构是什么,以及模式匹配的性能是什么?特别是,与搜索Trie的性能相比。
更新:我正在寻找对Erlang编译器实现的模式匹配的简明而准确的理解。什么是基础数据结构,以及搜索模式的效率如何?
答案 0 :(得分:1)
模式匹配编译本身没有“底层数据结构” - 它只是根据一组模式分解任何给定数据结构并最小化判断是否找到匹配所需的步骤数的策略,或者是否不可能匹配。
如果您的输入是字符串且模式是该字符串的前缀,那么行为就像特里搜索一样。以https://en.wikipedia.org/wiki/Trie为例并将其表示为Erlang案例开关:
Bitbucked
由于没有保护表达式使子句复杂化,编译器可以自由地重新排序它们以获得更高的效率(按类型和值对它们进行排序),以便共享相同前缀的所有模式都是相邻的。这对程序员来说很方便,程序员不必关心手动按顺序保存列表。
之后,编译器会将子句集转换为多个嵌套的较小的case表达式,执行最少量的测试。首先,它会检查第一个字符是case String of
"tea" -> 3;
"ted" -> 4;
"inn" -> 5;
"to" -> 7;
"in" -> 9;
"i" -> 11;
"ten" -> 12;
"A" -> 15
end
,A
还是i
。如果没有,则不能匹配,否则分支检查字符串的其余部分;例如,如果第一个字符是t
,请检查下一个字符是i
还是字符串的结尾。同样,如果它不是,那么就没有匹配,否则再次分支。依此类推,生成代码来检查所有模式的所有分支。