这让我想起了我做过一次的变异前缀树/ trie。稍有不同,但它可能工作。如果你有很大/没有界限,或者如果你不能把它转换成你的语言(我用C++编写),它可能无法工作。
因此,基本上,在特里,你通常存储对应于下一个字母的孩子,但我所做的就是对应于每个字母的频率,我存储的孩子。
什么问题,主要是(从我的角度来看)是,“是否存在有信的相同或更多的比任何子集?“例如,如果子集是{A,D,E,E},那么你需要找到是否有至少有一个A,一个D和两个E的集合
因此,像这样
Root
/| \
//|\ \
// | \ \
1 2 ... MAX <-- This represents the frequency of "A"
/|\ ..... /|\
1..MAX 1..MAX <-- Frequency of "B"
...............
...............
...............
1 ... ... ... MAX <-- Frequency of "Y"
/|\ .... ..../| \
1..MAX ...... 1 .. MAX <-- Frequency of "Z"
基本上所有的...的代表很多东西,必须花很长时间来显示/,|,和\表示父子关系和MAX代表一个字母的最大频率
所以你做什么,你有一个类似的结构(I代码在C++中):
struct NODE {
NODE *child[MAX + 1]; // Pointers to other NODE's that represents
// the frequency of the next letter
};
当您创建节点时,您需要将其所有子节点初始化为NULL。您可以通过(在C++)构造函数或类似
NODE* makeNode() {
NODE* n = new NODE; // Create a NODE
for(int i = 0;i <= MAX;i++) // For each child
n->child[i] = NULL; // Initialize to NULL
};
,在启动时makeNode()函数做到这一点,线索仅仅是一个根
NODE* root = new NODE;
当您添加一组到特里,你得到每个字母的频率,并通过特里。如果在特定的节点上,与下一个字母对应的子项为NULL,则只需创建一个新的NODE。
当您搜索trie时,您将搜索每个节点上与子集或更大的字母频率相对应的所有子节点。例如,如果子集有3个A,则搜索所有的root-> child [3],然后root-> child [4],然后...然后root-> child [MAX]。
它可能过于复杂和混乱,从而1)如果你觉得我是不是疯了,那么请在什么混乱发表评论,2)你可能/可能想随便找一个更简单的方法
听起来像是你需要查找anagram软件的例子。 – Orbling 2011-03-05 01:27:55
有趣的是你应该提到这一点;这是一种变形图;但是,我需要找到“近似anagrams”或部分anagrams。即我需要通过重新排列和添加给定池中的字母来找到字形。 – PBJ 2011-03-05 11:23:38