大約有400萬條記錄,每記錄的字串長度為40個數字字符,現在要求如果兩個字串的公共子字串的長度程超過10,就輸出這兩個字串,可半天都找不出來一個
我的辦法很笨,是把所有的字符都裝進陣列,然后再處理。,能不能有更好的辦法
uj5u.com熱心網友回復:
好像就是兩兩組合的窮舉比對吧,一時想不出還有啥高效的辦法。400萬個40位元組,算來也不到200M,讀到記憶體里不應該有什么問題吧。uj5u.com熱心網友回復:
google 后綴陣列 動態規劃 lcs思路就是所有字串全部放入后綴陣列,然后排序
VB不支持指標,實作起來效率很低。
uj5u.com熱心網友回復:
這試這樣是不是好些?
Public Function CompStr(Str1 As String, Str2 As String, Optional ByVal Length As Integer = 10) As Boolean
'Str1,Str2需要比較的兩個字串
'Lenght 匹配的長度量,超過lenght的輸出true,否則false
Dim I As Integer, subStr As String
For I = 1 To Len(Str1) - Length
subStr = Mid(Str1, I, Length + 1)
If InStr(Str2, subStr) > 0 Then Exit For
Next
CompStr = CBool(I < Len(Str1) - Length)
End Function
uj5u.com熱心網友回復:
“把所有的字符都裝進陣列” 這個有什么用?如果是“所有的字串”,那是應該的。
但必須記憶體足夠大才行,
單是這400W條40字符的資料,
就得超過320M以上的空間。
如果空閑記憶體不夠,會轉移到交換區,
你的“資料裝載”程序可能都會很漫長。
“半天都找不到一個”,也許你的查找方法就不對。
你最好還是用一些實體資料,
來說明一下什么樣子的“符合”、什么樣的不符合。
uj5u.com熱心網友回復:
40個字符,占80位元組+4位元組。
400萬條,就是約336M。
400萬元素的字串陣列,總共約16M。
這粗略一算,就是350M左右了。
uj5u.com熱心網友回復:
既然公共字串長度超過10,那就把每個字串拆成N個11長度的字串。接下來就好辦了。
uj5u.com熱心網友回復:
電腦用的是4G記憶體,可以把整個記錄集都裝入陣列,花的時間大約是10分鐘,但在運行時,出現stack overflow at line 0
用小量資料測驗過,程式邏輯沒有錯,就是速度問題,用250條記錄就花了10秒左右才搞找出符合條件的,至于說2w條記錄,那等了半天程式還是沒停下來,直接關閉,等不起!
uj5u.com熱心網友回復:
不給資料、代碼的求分析都是耍流氓!uj5u.com熱心網友回復:
“花的時間大約是10分鐘”?
應該是“10秒”吧!就你這樣的400W記錄,也就160M的樣子。
“程式邏輯沒有錯”,不代表“運行效率也不錯”。
uj5u.com熱心網友回復:
建立一個資料庫吧。把表 1 中每條 40 位元組的記錄分成新建的表 2 中的 31 條子記錄,一個欄位是子串(長度 10 位元組),另一個欄位是記錄在原表中的 ID。
首先查詢表 2 中分組累計值大于 1 的記錄集。然后查詢表 2 中字串欄位在前一個查詢中的記錄集。當然,可以將前一步作為一個子查詢,一次完成。
此時,你查這個記錄中的 ID 就好了。
uj5u.com熱心網友回復:
把400萬條記錄,照這樣“查詢”下來,你準備花幾小時來“等待完成”?
-_-!!!
uj5u.com熱心網友回復:
把400萬條記錄,照這樣“查詢”下來,
你準備花幾小時來“等待完成”?
-_-!!!
建立一個資料庫吧。
把表 1 中每條 40 位元組的記錄分成新建的表 2 中的 31 條子記錄,一個欄位是子串(長度 10 位元組),另一個欄位是記錄在原表中的 ID。
首先查詢表 2 中分組累計值大于 1 的記錄集。然后查詢表 2 中字串欄位在前一個查詢中的記錄集。當然,可以將前一步作為一個子查詢,一次完成。
此時,你查這個記錄中的 ID 就好了。
明白你意思,可我用的是access,把400w條記錄,每條分拆成31條子串,哪差不多就是1.2億條記錄,分組大概要多長時間?
想用SQL,但不懂.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/115387.html
標籤:VB基礎類
上一篇:VB正則運算式問題
