回 帖 发 新 帖 刷新版面

主题:求助利用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个回复)

沙发

能用数据库做吗
把两个文件变成表,用where或其它的,很多种方法,应该不难吧,且高效

我来回复

您尚未登录,请登录后再回复。点此登录或注册