java sql相似度算法_通用算法-sql相似度模糊匹配

1、需求描述:數據庫采集sql語句的記錄表,包含記錄編號-ID、日期時間-data、sql語句-statement,對表內每一條記錄的sql語句和表內其他記錄的sql語句進行模糊匹配,以順序字符匹配方式進行,達到定義的相似度,就為該相似度統計值加1,目的是統計和該sql語句類似語句的執行頻率;表內每新增一條記錄就要和表內原保存所有記錄進行sql模糊匹配,並為表內原保存記錄的相應相似度等級增加統計值,比如原來表內有100萬內,現在新增一條,則要和100萬進行匹配;相似度等級定義:100%完全相似、99%-90%較高相似、89%-80%基本相似、79%-70%接近相似;原記錄sql語句和匹配的記錄sql語句達到所定義相似度就增加統計值,其中各級別不累加,比如達到較高相似,基本相似和接近相似不增加統計值。

2、sql表設計字段如下:

ID     date                                statement                                   100%degree     90%degree    80%degree     70%degree

1       2013-4-22 10:10:10        select * from A   where B=C         20                    50                  30                   80

2       2013-4-22 10:11:10       delete * from  A  where   B=C       6                      3                    10                    2

3、通用算法:

1)每新增一條記錄N,與1...N-1條記錄內statement的sql語句進行順序匹配,比如和記錄1進行匹配,statement進行字符順序匹配,達到100%相似就在100%degree加1,為21,如果是在99%-90%區間相似度,則為 90%degree加1為51,類似,如果低於70%,則沒有任何相似不統計;

2)算法復雜度:假如sql表內有100萬條記錄,每增加1條,要進行100萬次sql語句匹配,為每一條記錄統計四個等級的相似度,那么算法復雜度就是線性階O(n)-100萬條匹配下去統計每一條記錄的相似度;同時每次匹配內都要進行兩個sql語句的字符串匹配,其算法復雜度為O(n*m)-兩個sql語句字符長度大小的每個字符比較,如果第一個字符都不相同,那么就可以馬上放棄匹配,如果完全相同,則達到平方階O(n2);整體算法復雜度將是立方階O(n3)。假設已有100萬,每分高峰新增1萬條,sql語句平均字符長度為20,那么算法復雜度就是每分鍾要完成100萬*1萬*20*20的執行時長,在實時情況下性能要求較高。

4、字符串匹配的改進算法:

在通用算法基礎上改進sql語句字符匹配算法,在匹配串中尋找模式串是否出現及出現多少字符(相似度=相同字符/匹配串字符長度),通用算法是將匹配串和模式串左對齊,然后從左向右一個一個進行比較,如果不成功則模式串向右移動一個單位。改進上可以采用的字符串匹配算法有:KMP算法、Horspool算法、Boyer-Moore算法、Sunday算法、RK算法,一般串匹配方法,是將模式串的一個一個字符作為小的特征去分別進行匹配,而RK算法則是將串整體作為一個特征。

5、提高算法空間復雜度的改進算法:

sql表設計字段改進,增加每條記錄每個相似度等級的相關記錄,比如ID=2的記錄,90%degree有3條記錄,那么我記錄下這三條記錄的ID號,一旦新增的記錄ID=N和ID=2滿足90%相似度,那么自然繼承了ID=2與這3條記錄的90%相似度,就可以對這三記錄(關聯了這三條記錄的ID)的90%degree分別加1,即ID=2和ID=n以及這三條記錄的90%degree值都是4。這種繼承屬性就減少了匹配條數,不需要進行100萬次匹配了,不如在第20萬條滿足了,那么后面80萬條就不用匹配了。

6、改進算法方向:顯然算法還不夠合理,需要進一步優化,方向在於犧牲空間降低時間,比如多表支撐百萬記錄匹配,而串匹配算法不斷改進也是重要的。也可以考慮引進數據挖掘來支撐該統計分析需求。如果實時無法達到需求,可以采用非高峰期定時執行匹配。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值