![]() |
||
|
Senior Member
![]() ![]() ![]() 加入日期: Jun 2001 您的住址: 台灣
文章: 1,212
|
感謝您的心得分享!
引用:
__________________
回饋小黃卡號 34923092 |
||||||||
|
|
|
Amateur Member
![]() 加入日期: Dec 2003 您的住址: 家
文章: 39
|
使用雲端運算去比對大量資料,速度會不錯唷^^
|
||
|
|
|
*停權中*
加入日期: Dec 2006 您的住址: 大鵰村
文章: 12
|
我覺得根本沒有更好的方法
因為不一樣字元出現的機率沒有規則 所以時間複雜度都是..O(n)... 如果實作的話... 1.看Windows有沒有提供API...(我記得是有) 會快一點 2.取兩字串中m個字元的CRC(須考慮m與CRC重複機率的問題,其他方法也可以,就是求出m個字元的特徵值)之類的 然後檢查是否相等 如果相等代表該m個字元相同 不相等就找出來 重複上步驟直到完成... 警告!! 本回應是嘴砲文 認真思考會腦殘 ![]() 此文章於 2009-06-25 08:15 PM 被 阿宅 編輯. |
|
|
|
Junior Member
![]() ![]() ![]() 加入日期: May 2005 您的住址: Autobahn, Deutschland
文章: 743
|
在 Form 上拉出 CommandButton x1 (Command1)、ListBox x2 (List1, List2)
此範例 Form Load 時亂數產生兩個字串,故設定的長度越長將影響 Form Load 時間。 請根據你的需求修改成符合適合你的狀況。 兩字串長度為4096,有100處不同時。 在Pentium-M 2.23G, DDRII 533 2GB, 915GM 主機上執行: 純比對:1ms 以內完成 輸出至ListBox:14~17ms完成 輸出至ListBox+Debug:90~95ms完成 備註:計算比對其實很快,你要注意的是輸出的方式! Pos S1 S2 9 --> q [71] Y [59] 124 --> : [3A] ] [5D] 227 --> f [66] U [55] 236 --> 4 [34] < [3C] 260 --> F [46] A [41] 285 --> X [58] 5 [35] 369 --> { [7B] s [73] 458 --> D [44] _ [5F] 509 --> W [57] K [4B] 596 --> i [69] z [7A] 613 --> b [62] S [53] 646 --> I [49] b [62] 721 --> 4 [34] x [78] 749 --> D [44] P [50] 776 --> } [7D] q [71] 779 --> d [64] 1 [31] 904 --> Z [5A] g [67] 920 --> m [6D] | [7C] 922 --> < [3C] 3 [33] 928 --> K [4B] { [7B] 953 --> | [7C] u [75] 982 --> v [76] ; [3B] 1051 --> 4 [34] T [54] 1101 --> 5 [35] 2 [32] 1134 --> : [3A] Z [5A] 1162 --> R [52] 5 [35] 1245 --> I [49] S [53] 1279 --> i [69] L [4C] 1285 --> v [76] ^ [5E] 1318 --> z [7A] G [47] 1349 --> 3 [33] } [7D] 1433 --> g [67] i [69] 1435 --> m [6D] [ [5B] 1440 --> D [44] T [54] 1537 --> \ [5C] c [63] 1594 --> U [55] p [70] 1644 --> z [7A] a [61] 1670 --> f [66] @ [40] 1678 --> ` [60] = [3D] 1715 --> 4 [34] w [77] 1799 --> C [43] X [58] 1814 --> h [68] d [64] 1827 --> K [4B] I [49] 1873 --> V [56] L [4C] 1936 --> ] [5D] < [3C] 1943 --> B [42] W [57] 2040 --> b [62] L [4C] 2111 --> G [47] J [4A] 2164 --> ~ [7E] [7F] 2183 --> 8 [38] l [6C] 2197 --> x [78] h [68] 2223 --> M [4D] E [45] 2306 --> z [7A] ^ [5E] 2332 --> = [3D] x [78] 2390 --> K [4B] P [50] 2462 --> R [52] ~ [7E] 2488 --> T [54] X [58] 2515 --> r [72] R [52] 2531 --> _ [5F] X [58] 2621 --> 2 [32] E [45] 2635 --> h [68] q [71] 2658 --> L [4C] a [61] 2744 --> @ [40] ~ [7E] 2745 --> @ [40] B [42] 2764 --> 7 [37] z [7A] 2798 --> Q [51] O [4F] 2884 --> l [6C] T [54] 2894 --> 4 [34] [7F] 2896 --> V [56] y [79] 2947 --> u [75] l [6C] 2977 --> X [58] 2 [32] 2984 --> [ [5B] ? [3F] 3034 --> < [3C] p [70] 3207 --> T [54] 3 [33] 3227 --> f [66] r [72] 3235 --> I [49] S [53] 3242 --> L [4C] ; [3B] 3243 --> F [46] u [75] 3273 --> | [7C] f [66] 3286 --> } [7D] N [4E] 3287 --> A [41] c [63] 3393 --> k [6B] J [4A] 3485 --> ? [3F] N [4E] 3515 --> [7F] 3 [33] 3556 --> @ [40] < [3C] 3557 --> ^ [5E] 8 [38] 3583 --> c [63] s [73] 3597 --> R [52] W [57] 3633 --> f [66] 8 [38] 3660 --> g [67] 0 [30] 3687 --> M [4D] 7 [37] 3708 --> r [72] z [7A] 3730 --> p [70] : [3A] 3772 --> ~ [7E] ` [60] 3904 --> _ [5F] 7 [37] 3923 --> 5 [35] : [3A] 3982 --> < [3C] P [50] 4025 --> n [6E] 4 [34] 4083 --> M [4D] y [79] Time Cost:94ms 代碼:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private s1 As String
Private s2 As String
Private sLen As Long
Private t1 As Long
Private t2 As Long
Private Sub Command1_Click()
Dim bCx As Long
Dim b1() As Byte
Dim b2() As Byte
Dim export As String
List2.Clear
t1 = GetTickCount
ReDim b1(1 To sLen)
ReDim b2(1 To sLen)
RtlMoveMemory b1(1), ByVal s1, sLen
RtlMoveMemory b2(1), ByVal s2, sLen
Debug.Print "Pos", "S1", "S2"
For bCx = 1 To sLen
If b1(bCx) <> b2(bCx) Then
export = bCx & " --> " & Chr(b1(bCx)) & " [" & Hex(b1(bCx)) & "]" & " " & Chr(b2(bCx)) & " [" & Hex(b2(bCx)) & "]"
List2.AddItem (export)
Debug.Print export
End If
Next bCx
t2 = GetTickCount
Debug.Print
Debug.Print "Time Cost:" & (t2 - t1) & "ms"
End Sub
Private Sub Form_Load()
Dim tCx As Long
Dim tPos As Long
sLen = 4096
s1 = vbNullString
s2 = vbNullString
For tCx = 1 To sLen
s1 = s1 & Chr(Int(Rnd() * 80) + 48)
Next tCx
s2 = s1
For tCx = 1 To 100
tPos = Int(Rnd() * sLen) + 1
List1.AddItem (tPos)
Debug.Print tPos
Mid(s2, tPos, 1) = Chr(Int(Rnd() * 80) + 48)
Next tCx
End Sub
|
|
|
|
*停權中*
加入日期: Aug 2004
文章: 317
|
引用:
感謝你的程式碼 輸出這點小弟沒考慮到 謝謝 ![]() |
|
|
|
|
*停權中*
加入日期: Apr 2009
文章: 52
|
VB6 是啥?記得好像是很久、很久、很久、很久、很久、很久以前的程序,現在的學校與社會脫節這麼嚴重?
![]() |
|
|
|
Junior Member
![]() ![]() ![]() 加入日期: May 2005 您的住址: Autobahn, Deutschland
文章: 743
|
說古老...VB6也不過是1998年的產品,比這還古老卻更耐命甚至淘汰不了的東西可是一堆啊!如:Informix。
別看VB6簡單、古老就嫌棄它,許多企業內部還是一堆VS6系列開發的軟體,也很難去淘汰。看來你跟社會也是脫節的蠻嚴重的! 引用:
|
|
|
|
|
Junior Member
![]() ![]() ![]() 加入日期: May 2005 您的住址: Autobahn, Deutschland
文章: 743
|
我也很久沒寫VB6的程式了,藉你這個例子,剛好來個溫習∼
方便的話,能就你現有的程式以及我張貼的程式碼對相同的字串條件來個效能比較嗎? 引用:
此文章於 2009-06-25 11:56 PM 被 ivantw 編輯. |
|
|
|
|
Senior Member
![]() ![]() ![]() 加入日期: Feb 2002
文章: 1,172
|
一定要用vb6的話 大概只能迴圈了
建議還是用.net多執行緒會快很多 尤其是這種純比對的部份 另外建議 不要一比對完畢有值就丟出來 最好是一樣開一個string收起來到一定的數量再顯示出來 因為這樣會造成 程式先去計算然後再Call UI thread 然後又出來計算 又回去Call UI thread 另外我覺得多執行緒需要考慮的倒不是怎麼切分 而是順序不要弄錯了 雖然說理論上先開的thread會先完成 但是...也很難說 所以....最好是丟進去之前自己先編好變數順序 結果出來之後一次結合顯示 反正vb又不太需要管記憶體 反正變數設下去就衝啦 快睡著了 所以Code你自己加油吧 |
|
|
|
Golden Member
![]() ![]() ![]() ![]() 加入日期: Jun 2002 您的住址: 地獄18層
文章: 3,273
|
樓主算不錯了
我現在連程式人員的面試心得及基本原則裡面的 1-2+3-4+5-6+7......+n 用VB還寫不出來 ![]()
__________________
徵你不要的AM4 CPU 徵你不要的SATA接頭斷裂SSD
|
|
|