主题:求助利用VB高效的运算两个字符型数组的交集和并集
如何高效的计算数组交集和差集,
利用双色球号码为例:
文件1:(部分)
01 02 03 04 05 07
01 02 03 04 05 09
01 02 03 04 05 17
01 02 03 04 05 23
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 07 14
01 02 03 04 07 28
01 02 03 04 08 12
01 02 03 04 08 13
.........
文件二:(部分)
01 02 03 04 05 23
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 07 14
01 02 03 04 07 28
01 02 03 04 05 25
01 02 03 04 05 25
01 02 03 04 07 28
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 05 25
01 02 03 04 07 08
..........
思路:将"01 02 03 04 05 07"作为字符型数组的一个记录,
将两个文件分别读入,形成2个字符型1维数组,然后进行数组的交集和并集计算,然后输出
其中文件1为双色球全部出球号码(共计1107568注)
文件2为部分双色球部分出球号码(共计1304700条记录,其中有很多重复记录)
以下为VB程序全文,数组1(1107568条记录)和数组2(1304700条记录)计算交集共用接近10分钟
请问,如何提高效率,将计算时间最大限度的缩短
Private Sub Command1_Click()
Dim i, j As Long, arr1(1 To 3000000) As String, arr2(1 To 3000000) As String
Dim dic1 As Object
'读入文本文件名称
openfilename1 = Text1.Text
openfilename2 = Text2.Text
'读入文本文件,每行最为1组字符,并取出行数(记录数量)
'2个文本文件,记录数量均大于100万条,其中第一个文本文件包含全部的记录(1107568条,双色球全部出球号码),
'第二个文本文件中的记录1304700条,其中有重复的记录,
'用时共计13秒
i1 = 0
Open openfilename1 For Input As #1
Do Until EOF(1)
i1 = i1 + 1
Line Input #1, strline
arr1(i1) = Mid((strline + Chr(13) + Chr(10)), 1, 17)
Loop
Close #1
i2 = 0
Open openfilename2 For Input As #1
Do Until EOF(1)
i2 = i2 + 1
Line Input #1, strline
arr2(i2) = Mid((strline + Chr(13) + Chr(10)), 1, 17)
Loop
Close #1
'将数组arr1(全部的出球号码)建立字典,并字典赋值为"0"
'用时2分10秒
Open "chaji.txt" For Append As #3
Set dic1 = CreateObject("scripting.dictionary")
For i = 1 To i1
dic1(arr1(i)) = 0
Next
'将数组arr2(重复的号码),导入字典,如有重复的记录,则字典赋值+1
'用时5分15秒
For j = 1 To i2
dic1(arr2(j)) = dic1(arr2(j)) + 1
'If Not dic1.Exists(temp) Then
Next
'将字典值为"0"的值输出为文本文件
'用时2分
For i = 1 To i1
If dic1(arr1(i)) > 0 Then
GoTo line1
Else
Print #3, arr1(i)
End If
line1:
Next
Stop
Set dic1 = Nothing
Close #3
End Sub
'本程序共计用时9分38秒
利用双色球号码为例:
文件1:(部分)
01 02 03 04 05 07
01 02 03 04 05 09
01 02 03 04 05 17
01 02 03 04 05 23
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 07 14
01 02 03 04 07 28
01 02 03 04 08 12
01 02 03 04 08 13
.........
文件二:(部分)
01 02 03 04 05 23
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 07 14
01 02 03 04 07 28
01 02 03 04 05 25
01 02 03 04 05 25
01 02 03 04 07 28
01 02 03 04 05 25
01 02 03 04 07 08
01 02 03 04 05 25
01 02 03 04 07 08
..........
思路:将"01 02 03 04 05 07"作为字符型数组的一个记录,
将两个文件分别读入,形成2个字符型1维数组,然后进行数组的交集和并集计算,然后输出
其中文件1为双色球全部出球号码(共计1107568注)
文件2为部分双色球部分出球号码(共计1304700条记录,其中有很多重复记录)
以下为VB程序全文,数组1(1107568条记录)和数组2(1304700条记录)计算交集共用接近10分钟
请问,如何提高效率,将计算时间最大限度的缩短
Private Sub Command1_Click()
Dim i, j As Long, arr1(1 To 3000000) As String, arr2(1 To 3000000) As String
Dim dic1 As Object
'读入文本文件名称
openfilename1 = Text1.Text
openfilename2 = Text2.Text
'读入文本文件,每行最为1组字符,并取出行数(记录数量)
'2个文本文件,记录数量均大于100万条,其中第一个文本文件包含全部的记录(1107568条,双色球全部出球号码),
'第二个文本文件中的记录1304700条,其中有重复的记录,
'用时共计13秒
i1 = 0
Open openfilename1 For Input As #1
Do Until EOF(1)
i1 = i1 + 1
Line Input #1, strline
arr1(i1) = Mid((strline + Chr(13) + Chr(10)), 1, 17)
Loop
Close #1
i2 = 0
Open openfilename2 For Input As #1
Do Until EOF(1)
i2 = i2 + 1
Line Input #1, strline
arr2(i2) = Mid((strline + Chr(13) + Chr(10)), 1, 17)
Loop
Close #1
'将数组arr1(全部的出球号码)建立字典,并字典赋值为"0"
'用时2分10秒
Open "chaji.txt" For Append As #3
Set dic1 = CreateObject("scripting.dictionary")
For i = 1 To i1
dic1(arr1(i)) = 0
Next
'将数组arr2(重复的号码),导入字典,如有重复的记录,则字典赋值+1
'用时5分15秒
For j = 1 To i2
dic1(arr2(j)) = dic1(arr2(j)) + 1
'If Not dic1.Exists(temp) Then
Next
'将字典值为"0"的值输出为文本文件
'用时2分
For i = 1 To i1
If dic1(arr1(i)) > 0 Then
GoTo line1
Else
Print #3, arr1(i)
End If
line1:
Next
Stop
Set dic1 = Nothing
Close #3
End Sub
'本程序共计用时9分38秒