用于匹配池中

时间:2016-08-30 14:11:30

标签: regex algorithm computer-science graph-theory

这个标题太可怕了。

我不确定如何快速描述这个问题。我是自学成才的程序员(业余爱好> 10年,专业&> 3年)所以我没有很多计算机科学知识可以帮助解决这样的问题,这就是为什么我&#39 ; m发布这个。我希望能听到解决这个问题的更好方法。我不需要一个全面的解决方案,但可能有些类型的数据结构或算法可以帮助我。朝着正确的方向发展。

我有根据州建立的网址,例如:

state: 'foo', url: '/foo'
state: 'foo.bar' url: '/bar'

foo&#39}的网址为/foo

bar的网址为/foo/bar

这有意义吗?它继承了父母的URL。

此外,barfoo的孩子,州可以拥有无​​限数量的子女:foo.barfoo.zarfoo.far,{{1和孩子可以有孩子,etc.foo.bar.alphafoo.bar.beta。这没有严格的最大深度。

因此,URL制作是一件容易的事,已经完成了。我试图反过来。

如果我有网址etc,我如何查找创建此网址的状态?

问题在于,州的网址可以随心所欲,并且不必独立开始,例如:

/foo/bar

我提出的一个解决方案是创建一个包含所有创建的URL的查找表,这些URL指向创建它们的状态。创造它并不可怕,但看起来并不聪明,感觉非常强大。

我的第二个解决方案是将要分析的网址拆分为块,用斜线state: 'zar', url: '/one/two/three' state: 'far', url: '/one/two/nine' 拆分,然后分析每个" root"通过/分割该URL,并尽可能多地匹配块,然后选择具有最匹配块的块。我的问题是我最终会走错路:

/

有可能选择state: 'alpha', url: '/alpha' state: 'alpha.beta', url: '/beta' state: 'alpha.beta.gamma', url: '/gamma' state: 'foxtrot', url: '/alpha' state: 'foxtrot.beta', url: '/beta' state: 'foxtrot.beta.gamma', url: '/foxy' > alpha然后失败,因为没有alpha.beta状态,正确的根目录是/foxy。似乎这种方式可能更慢,不得不动态构建URL而不是使用查找。另外,像这样的特定情况确实非常奇怪,但可能会发生。

我感谢任何人甚至可以看一看。如果有人关心,我会在此期间实施一个查找表来解决这个问题,但我对其他解决方案非常好奇。

修改

如果感兴趣,可以使用以下内容:https://jsbin.com/muvuza/4/edit?js,console

1 个答案:

答案 0 :(得分:0)

您想要将字符串映射到对象。据我所知,你需要一个查找表来执行任何给定的语言。在JS中,您可以使用字符串直接访问对象的属性,因此该表基本上已经为您完成了。

//javascript
//define some states
var starting_states = [zar, far, alpha, foxtrot];
var url = '/zar/one/two/three/';
var urlPieces = url.split("/");

//Iterate through states, selecting the next hashed object
var state = starting_states[urlPieces[0]];
for(var i=1;i<urlPieces.length;i++){
  state = state[ urlPieces[i] ];
}