找回密码
 加入
搜索
查看: 5225|回复: 10

[效率算法] [已解决]求个快速的算法:查找数组内缺少的插入一行。

  [复制链接]
发表于 2013-11-21 21:08:16 | 显示全部楼层 |阅读模式
本帖最后由 ioripalm 于 2013-11-28 07:26 编辑

正常情况下,数组大小[256][2]
如下:
Row        Col0     Col1
[0]          255                 
[1]          1          CM1
[2]          2          dm2
[3]          3          kc1
[4]          4          mc1
[5]          5          qc1
[6]          6          df1
[7]          7          gl2
[.]           .           xx.
省略
[.]           .           xx.
[.]           .           xx.
[255]      255     xxx

非正常情况下,数组大小[X][2]
Row       Col0     Col1
[0]          X
[1]          1          CM1
[2]          2          dm2
[3]          3          kc1
[4]          5          qc1
[5]          6          df1
[6]          7          gl2
[7]          8          cc1
[.]           .           xx.
省略
[.]           .           xx.
[.]           .           xx.
[X]          255      xxx


数组的Col1是1-255的自然数(代表IP最后一段),Col2是计算机名,每个计算机名都是和IP对应的,不能错位
也就是说非正常情况下,数组的数据会少几个,具体少哪几个不知道。
有没有什么算法可以找到少的那几个,然后将少的添加到应在的位置,让数组保持正常状态。由于不知道计算机名,也就只能添加Col1,Col2可以留空。
效果如下:
Row        Col0     Col1
[0]          255                 
[1]          1          CM1
[2]          2          dm2
[3]          3          kc1
[4]          4         
[5]          5          qc1
[6]          6          df1
[7]          7          gl2
发表于 2013-11-21 22:11:08 | 显示全部楼层
看来是个固定元素的二维数组,对电脑来说,重新赋值256个元素的二维数组应该不是什么难事~
#include <array.au3>
Dim $ip[256][2]
_Def()
_ArrayDisplay($ip, "初次赋值数组")
_ArrayDelete($ip, 8)
_ArrayDisplay($ip, "删掉一组元素后数组")
For $i = 0 To 255
        If $ip[$i][0] <> $i Then _Def()
Next
_ArrayDisplay($ip, "检测后重新赋值数组")
Func _Def()
        ReDim $ip[256][2]
        $ip[0][0] = 255
        $ip[0][1] = ""
        For $i = 1 To $ip[0][0]
                $ip[$i][0] = $i
                $ip[$i][1] = "IP" & $i
        Next
EndFunc   ;==>_Def
发表于 2013-11-21 22:30:47 | 显示全部楼层
才两百来个,确实像发哥这样以“序号”检测吧。大数据应该用数据库。
 楼主| 发表于 2013-11-22 19:24:23 | 显示全部楼层
本帖最后由 ioripalm 于 2013-11-22 19:26 编辑

回复 2# haijie1223

老大,COL1下面IP1不一定是IP1的,是随机的计算机名。
要是固定的这样,就好弄了。
发表于 2013-11-22 19:35:07 | 显示全部楼层
回复 4# ioripalm


    那就把元素换成计算机名就是了~
 楼主| 发表于 2013-11-22 19:56:27 | 显示全部楼层
回复 5# haijie1223


    怎么换呢?我重新编辑了问题,帮忙看下!我觉得你那个脚本只能解决计算机名是“IP+地址”这样的情况,实际是每个地址对应的计算机名是不一样的,不能错位。少的补上IP,留空计算机名。
发表于 2013-11-22 22:05:04 | 显示全部楼层
回复 6# ioripalm


    是啊,每台计算机对应一个ip,只要路由器不重启,一般情况下不会错位的,建议程序运行之前,先扫描一下网络,把ip和计算机名对应一下,把对应的数据放入数组,不就转化成我的代码功能了么~~
 楼主| 发表于 2013-11-27 13:18:12 | 显示全部楼层
回复 7# haijie1223


    别把问题复杂化啊,又弄什么路由器了?情况就是上面的数组,缺少的行加进去,就这么简单,如果这个数组不是ip和计算机名呢?是个员工号对应工资表呢?我举例说ip是为了形象化一些!
就是单纯的拿第二个数组下手,排列为第一个数组那样。
发表于 2013-11-27 14:40:33 | 显示全部楼层
Dim $a[11][2] = [[10],[1, 'CM1'],[2, 'dm2'],[3, 'kc1'],[7, 'gl2'],[8, 'gss'],[10, 'hh2'],[11, 'hh3'],[14, 'mc1'],[15, 'qc1'],[20, 'df1']]
;~#include <Array.au3>
;~_ArrayDisplay($a, '')

Local $sArr = '', $sArrAdd = '', $iX = 0, $i
For $i = 1 To UBound($a) - 1
        $iX += 1
        If $a[$i][0] = $iX Then
                $sArr &= $a[$i][0] & '|' & $a[$i][1] & @LF
        Else
                $i -= 1
                $sArr &= $iX & '|' & @LF
                $sArrAdd &= $iX & ','
        EndIf
Next
MsgBox(0, '补足', $sArr)
MsgBox(0, '缺位', $sArrAdd)
发表于 2013-11-27 18:32:54 | 显示全部楼层
回复 8# ioripalm


    哦,那你应该提前说清楚了,可能是IP,可能是员工号,可能是工资表,可能是姓名,可能是性别,可能是年龄,可能是。。。问题的解决方法不止一种,当然是具体问题具体对待了。既然你举例是IP,那当然要拿IP进行讨论。总的来说,还是那个思路,提前把数组写好了,然后遍历检查就好了~
 楼主| 发表于 2013-11-28 07:25:44 | 显示全部楼层
感谢A饭有一次解决了我的问题,每次都是A到成功啊!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 13:18 , Processed in 0.074636 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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