|
本帖最后由 香川群子 于 2014-4-4 12:10 编辑
先公布一下我的数组算法,有详细注释:- Sub kagawa()
- Dim arr, brr, crr, xrr, i&, j&, k&, m&, n&, s1&, s2&, t&, x$, tms#
- tms = Timer
- arr = [a1].CurrentRegion '源数据读入数组arr
- m = UBound(arr) '数据最大行数m
-
- ReDim xrr(m, 1) '创建记录姓名和序号的嵌套子数组xrr模板
- ReDim brr(1 To 6, 1 To 2) '定义与骰子点数对应的嵌套数组brr
- For i = 1 To 6 '对于各个骰子点数
- brr(i, 1) = xrr '男生记录数组初始化
- brr(i, 2) = xrr '女生记录数组初始化
- Next
-
- ReDim crr(1 To m, 1 To 3) '定义存储结果的数组crr
- For i = 2 To m '遍历循环各行
- If arr(i, 2) = "男" Then s1 = 1: s2 = 2 Else s1 = 2: s2 = 1
- '以s1/s2为性别参数 方便以后自动对准位置
- t = arr(i, 3) '读取当前骰子点数
- n = brr(7 - t, s2)(0, 0) + 1 '可配对点数7-t以及对应性别s2的读取位置n
- x = brr(7 - t, s2)(n, 0) '读取可配对位置信息 姓名x
- If x = "" Then '为空时不能配 则在当前性别s1的记录中存入当前信息
- n = brr(t, s1)(0, 1) + 1 '当前存入位置
- brr(t, s1)(0, 1) = n '存入位置记录n更新
- brr(t, s1)(n, 0) = arr(i, 1) '存入当前姓名
- brr(t, s1)(n, 1) = i '存入当前序号
- Else '可以配对时在对应性别s2中操作
- k = k + 1 '记录数组crr的行序号k + 1
- crr(k, s1) = arr(i, 1) '写入当前姓名
- crr(k, s2) = x '写入配对者姓名x
- j = brr(7 - t, s2)(n, 1) '获取配对点数7-t及对应性别s2配对者序号j
- If i < j Then crr(k, 3) = i Else crr(k, 3) = j '取最小序号(最先出现者)
- brr(7 - t, s2)(0, 0) = n '可配对读取位置n下移
- End If
- Next
-
- Application.ScreenUpdating = False
- [i2].CurrentRegion.Offset(1) = "" '清空输出区域
- [i2].Resize(k, 3) = crr '计算结果写入工作表
- [i2].Resize(k, 3).Sort [k2], 1, , , , , , 2 '用工作表排序方法
- [k:k] = "" '清空排序辅助的序号信息
- Application.ScreenUpdating = True
-
- MsgBox Format(Timer - tms, "0.000s ") & k
- End Sub
复制代码 我承认,用数组做比字典要难度大一点(思路更复杂一些)
但好处是速度一定更快。
再者说,和楼主的【复杂字典】用法相比较,反而或许是我的数组方法更容易理解了……。
…………
补充说明:
brr(i, 1) = xrr '男生记录数组初始化
我的嵌套数组xrr的格式是一个 0-m行、0-1共2列的二维数组
数组最大行数=m其实很浪费了。加入骰子点数和男、女人数比较均匀随机的话,
理论上取最大行数平均值=m/6/2,那么实际取 m/6一般也够了。
但为安全起见,闭着眼睛就全部用了m行。(这会浪费内存资源,如果实际运算有影响还是值得考虑减小行数)
接下来,这个xrr模板数组的用法其实特别地简单,起到了代替字典的作用:
brr(t,s1)(n,0) 即0列用来存储 姓名信息 即每次读入=arr(i,1)
brr(t,s1)(n,1) 即1列用来存储 对应序号 即每次读入= i 以便在最后排序时用
(话说出这个题的人也略微有些变态,因为这个排序基本上是毫无意义的。但是对增加题目难度还是有作用。)
其次,最重要的,是:brr(t,s1)(0,0) 和 brr(t,s1)(0,1) 这二个参数的记录作用。
说穿了也很简单:
即 (0,0)用来记录当前骰子点数、性别的人的【当前可配对者】在xrr模板数组中的行位置 即【取值位置】
而 (0,1)用来记录当前骰子点数、性别的人的【当前需记录者】在xrr模板数组中的行位置 即【存入位置】
如此,就是我的嵌套数组的全部秘密了。
|
|