C# 仅前向查找算法

C# 仅前向查找算法,c#,algorithm,guacamole,C#,Algorithm,Guacamole,给定一个{Length}.{Text}格式的字符串(例如3.foo),我想从有限列表中确定给定字符串是哪个字符串。 读取器从0索引开始,可以向前搜索(如果需要,跳过字符) 作为一个例子,考虑下面的列表: 10.disconnect 7.dispose 7.distort 确定已显示哪些字符串的最短方法可能如下所示: if(reader.Current==“1”) { //这个词是“断开连接” } 其他的 { 读者:前进(5); 如果(reader.Current==“p”) { //这个词是“

给定一个
{Length}.{Text}
格式的字符串(例如
3.foo
),我想从有限列表中确定给定字符串是哪个字符串。 读取器从0索引开始,可以向前搜索(如果需要,跳过字符)

作为一个例子,考虑下面的列表:

10.disconnect
7.dispose
7.distort
确定已显示哪些字符串的最短方法可能如下所示:

if(reader.Current==“1”)
{
//这个词是“断开连接”
}
其他的
{
读者:前进(5);
如果(reader.Current==“p”)
{
//这个词是“处置”
}
其他的
{
//这个词是“歪曲”
}
}
这个问题有两个部分,尽管我希望有人能给我指出正确的算法或信息理论的方面,我需要更多地了解

1) 给定一个有限的字符串列表,生成逻辑的最佳方法是什么,它需要最少的搜索次数&平均而言,通过比较来确定出现了哪个单词

2) 与第一种方法一样,但允许进行加权,以便可以考虑热路径。i、 e.如果“扭曲”一词的可能性是“断开连接”和“处置”一词的4倍,则上述逻辑平均而言,如果结构为:

reader.MoveForward(5);
如果(reader.Current==“t”)
{
//这个词是歪曲的
}
else/。。。
注意:我知道示例集中的第6个字符是唯一的,因此您只需对该字符执行
switch
,即可解决示例集中的所有问题,但请假设单词列表较长


此外,这并不是什么家庭作业——我正在为应用程序编写一个解析器/拦截层。我看过二叉树、尝试、Ulam的游戏和其他一些游戏,但没有一个符合我的要求。

我不知道这是否有帮助,但无论如何我会投入5美分

如果一棵树在列表中有更多的字符串时会自动变得更细粒度,并且会根据“热路径”检查现有的叶子,那该怎么办

例如,我会在您的列表中添加以下内容:

10.断开 7.处置 扭曲

root ---- 7 "check 4th letter" ------ if "t" return "distort"
     |      "in the order of "   |
     |      "  hot paths     "    --- if "p"return "dispose"
     |
     ----10 ---- return "disconnect"

你可以动态地建立这个模型。例如,如果添加7.display,则

root ---- 7 "check 4th letter" ------ if "t" return "distort"
     |      "in the order of "   |
     |      "  hot paths     "    --- if "p" --- "check 5th letter" --- if "o" ...
     |                                                               |
     ----10 ---- return "disconnect"                                  --- if "l" ...

因此,树中的节点将有一个变量“检查哪个索引”,并根据可能的结果(顺序由统计确定)留下相应的叶子。比如:

# python example
class node():
  def __init__(which_index, letter):
    self.which_index = which_index # which index this node checks to determine next node
    self.letter = letter # for which letter we go to this node
    self.leaves = SomeLinkedList()

  def add_leaf(node):
    self.leaves.putInCorrectPositionDependingOnHowHotPathItIs(node)

  def get_next(some_string):
    for leaf in self.leaves:
      if some_string[self.which_index] == leaf.letter:
         return leaf
    raise Exception("not found")
另一种选择当然是散列


但是,如果您是微优化,很难说,因为还有其他因素在起作用(例如,您从内存缓存中节省的时间可能非常重要)

是否有可能对给定列表进行排序/排序?或者它是否需要保持原样。您可以对列表进行排序。然而,这里的目标是基于从给定列表派生的规则设计代码(设计代码…?)。希望这有意义?我发现,如果删除仅向前规则,通过检查每个索引中字符的分布,可以相当容易地完成这项任务(手动/手动);分布越高,该索引越有用。前进只会让事情变得更加棘手:-/你的问题太宽泛了。也就是说,我认为你也找错了方向。1) 还没有人为协议编写解析器吗?使用现有的艺术可能更有意义。2) 您是否确实存在性能问题?字符串解析不应该给计算机带来太多的任务,如果有的话。I/O和其他操作肯定会主导计算成本吗。。。。。。3) “只向前”真的是这里重要的目标吗?例如,如果字符串总是采用“.”的形式,并且您可以对它们进行有限的选择,那么我希望字典会更简单、更快。4) 如果您坚持“仅向前”策略,我认为您正在研究一个状态机,或者该主题的一些变体。如果perf很重要,并且您认为您的测试证明了基于字典的方法和显式实现的状态机之间的显著差异,那么您应该使用后者。如果您对基于词典的方法是否可以改进感到好奇,可以将其发布到codereview.stackexchange.com。我不打算再搜索我的帖子了…旧新闻组的档案似乎不完整,而且似乎没有太多的意义去挖掘它。我知道你要做什么了,当然,这基本上就是我用来表示这一点的机制,同时试图强行解决树的顺序问题。我真正想要的是一种推导索引/字母/决策的方法。我已经能够手动计算一个只向前的决策树,它需要我最多检查3个字节,通常是2个字节。但我必须亲自去做,我不知道如何最好地考虑热点。我怀疑我的问题问得不好……:)