Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 爱疯

[已解决]对字典基本用法的提速

[复制链接]
发表于 2014-1-22 14:23 | 显示全部楼层    本楼为最佳答案   
对关键词拆分成二部分以后进行字典嵌套处理的算法:

字典处理部分时间略有增加,(要分二段进行处理)
但后面比对处理时速度更快了。(比对数据中前半部分不符合项越多速度越快)
  1. Sub test3()
  2.     Dim i&, k&, l&, s$, s1$, s2$
  3.     tms = Timer
  4.     'l = 0 '此参数为拆分参数,设置l=0时就相当于通常只使用1个字典的用法。
  5.    l = 3 ' 通常设置l=3 或l=4较好。
  6.         ' 但如设置l很大本例设置l=8时使得第一字典项很多就毫无效果了,反而速度更慢会死机
  7.    
  8.     arr = Sheet1.Range("a1").CurrentRegion
  9.     Set d = CreateObject("Scripting.Dictionary")
  10.     For i = 1 To UBound(arr)
  11.         s = arr(i, 1): s1 = Left(s, l): s2 = Mid(s, l + 1)
  12.         If Not d.Exists(s1) Then Set d(s1) = CreateObject("Scripting.Dictionary")
  13.         d(s1)(s2) = ""
  14.     Next
  15.     krr = d.keys
  16.     For i = 1 To d.Count
  17.         k = k + d(krr(i - 1)).Count
  18.     Next
  19.     MsgBox Format(Timer - tms, "0.000s ") & d.Count & vbCr & k: tms = Timer

  20.     m = Sheet2.Range("a1").End(4).Row
  21.     arr = Sheet2.Range("a1").Resize(m)
  22.     For i = 1 To m
  23.         s = arr(i, 1): s1 = Left(s, l): s2 = Mid(s, l + 1)
  24.         If Not d.Exists(s1) Then arr(i, 1) = "无" Else If d(s1).Exists(s2) Then arr(i, 1) = "有" Else arr(i, 1) = "无"

  25.         '上面是简写,下面是正规的If结构        
  26. '        If d.Exists(s1) Then
  27. '            If d(s1).Exists(s2) Then
  28. '                arr(i, 1) = "有"
  29. '            Else
  30. '                arr(i, 1) = "无"
  31. '            End If
  32. '        Else
  33. '            arr(i, 1) = "无"
  34. '        End If
  35.     Next
  36.     MsgBox Format(Timer - tms, "0.000s ") & m
  37.    
  38. '    Sheet2.Range("d1").Resize(m) = arr '输出到工作表
  39. End Sub
复制代码
爱疯你自己比较一下吧。

评分

参与人数 2 +26 金币 +20 收起 理由
fffox + 6 神马都是浮云!学习
爱疯 + 20 + 20 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2014-1-22 15:01 | 显示全部楼层
本帖最后由 香川群子 于 2014-1-22 15:02 编辑

测试30万随机数据(全部由数字组成的8位数账号)时,

设置参数l=3时有最好的表现。比使用单个字典要快上至少4-5倍。

为啥设置l=3最好呢?
这是可以证明的,理由如下:

参数             嵌套字典
l=   大字典数   项数          字典项总数        
0        1        300000        300001        
1        10        30000        30010        
2        100        3000        3100        
3        1000        300        1300        最佳
4        10000        30        10030
5        100000        3        100003
6        1000000      0        1000000
回复

使用道具 举报

 楼主| 发表于 2014-1-23 10:41 | 显示全部楼层
本帖最后由 爱疯 于 2014-3-21 10:34 编辑
香川群子 发表于 2014-1-22 15:01
测试30万随机数据(全部由数字组成的8位数账号)时,

设置参数l=3时有最好的表现。比使用单个字典要快上至 ...


学习群子老师的分段方法!
原来这么分的啊,前面我还以为只截取呢(理解错了)

像这样,将一个大数x分成两个乘数,x=y*z。当 y+z 是最小的时候,效率最高。
比如当L=3时,1000+300 是7种分法中最小的。
这种分段方法,应该有个名字吧,叫什么呢?

就好像奥运会开幕式时,比如要找"中国运动员姚明"
基本方法:直接对所有国家的所有运动员,逐个判断
分段方法:先找中国方队,再判断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 03:59 , Processed in 0.245322 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表