如何在SQL中检测“对话”模式?

时间:2010-08-03 09:02:19

标签: algorithm

实际上,这并不是特定于SQL,我怀疑“会话模式”是正确的名称,但我想不出更好的标题。

为了简化,想象一下你有大量的整数。任务是检测A.{1;max_n}A模式:如果int后面跟着n(> 0)其他整数,则int满足该模式,然后再次满足原始int,而n <= max_n。

示例:

...
1
4 <--
7 \
3  > n = 3
3 /
4 <--
2
...

这里,int 4重复使用3个任意整数,因此对于max_n&lt; = 3,值4满足模式。

问题是,如何检测大量数据转储中的哪些整数遵循此模式?我最感兴趣的是算法本身,但是SQL或C#中的一个例子也是受欢迎的。

我提出的天真想法是首先收集列表或所有不同的整数,然后以直接的方式检查每个模式,但这会导致性能瓶颈。

2 个答案:

答案 0 :(得分:1)

你可以保存一些字典(C#)或地图(C ++)结构,保存第一次出现数字的位置。

然后,对于每个数字,您应该检查它是否出现在地图中。如果是 - 您应该比较位置差异与之前发生的最大位置差异。否则,您应该在地图中保存数字及其位置。

答案 1 :(得分:0)

好吧,SQL不会以最佳方式执行此操作,但如果对列进行索引,则可能并不可怕。

首先,要谈谈SQL中的顺序,您应该有另一列。如果该列实际上等于行号,那么您可以:

SELECT DISTINCT
  t1.number
FROM 
  table t1, table t2
WHERE
  (t1.rownumber-t2.rownumber) <= @max_n AND
  (t1.rownumber-t2.rownumber) >=1 AND
  t1.number = t2.number AND
相关问题