继续读啊哈磊《啊哈!算法》感悟系列——队列
地铁售票处排队,先来的人先到队首先买完先走,后来的人排在队尾等候后买完后走。
想买票,必须排在队尾;买完票,只能从队首离开。
这种先进先出(First In First Out,FIFO),后进后出的线性队伍,就是我们说的——队列。
在现实中,队列里包含的是人,在计算机的队列里,包含的就是数据啦~所以,队列是一种——数据结构。
队列中的三要素为:队伍,队首,队尾。
如果用我们比较熟悉的数组来表示队列的话,队伍就是数组本身,队首和队尾就是数组中相应索引位的数值元素。
这里用《潜伏》中的一个情节来举一个应用队列的例子:
军统局给余则成一段数字,并告诉他只要按照指定的规则就可以将这段数字还原为情报密码。
有一天,余则成从电台接到了这段数字:196811234567
情报转译规则如下:将第一个数字移到最后,抠去第二个数字,将第三个数字移到最后,扣去第四个数字……按照这个规则下去,直到这段数字最后只剩下一个数字为止,将之前扣去的数字和最后剩下的数字按顺序连接起来,就是情报密码。
拿1931这四个数字举例,“[ ]”中代表扣去的数字:
第一次:[9]311
第二次:[1]13
第三次:[3]1
第四次:[1]
将“[ ]”中的数字按照你看到的从上到下的顺序连接起来,就是情报密码:9131。
这个规则就好比是排队买票(把情报中的数字看成是人):
第一个人不买票,回到队尾,让第二个人先买;第三个人不买票,回到队尾,让第四个人先买……不用担心,最后所有人都会买到票……
当然!现实生活中没有这么谦让的。我只是想要举个例子来说明——这个情报转译的规则其实就是在对一个队列进行着操作!
现在我们来把这个拆解情报的过程通过一段程序来搞定:
$qingBao = Read-Host "Please enter the information" $infoArray = New-Object System.Collections.ArrayList $infoArray.Add(0) for($i=0;$i -le $qingBao.length-1;$i++) { $infoArray.Add($qingBao[$i]) } function Translate($infoArray) { $head = 1 $tail = $infoArray.count $transArray = New-Object System.Collections.ArrayList while($head -le $tail) { $infoArray.Add($infoArray[$head]) $head++ $transArray.Add($infoArray[$head]) $tail++ $head++ } PrintTranslation $transArray } function PrintTranslation($transArray) { Write-Host "The translation is: " -ForegroundColor blue Write-Host $transArray -ForegroundColor green } Translate $infoArray
怎么样,PowerShell中对动态数组的Add操作是不是非常方便呢?
在PowerShell ISE中运行该段代码,并用1931这四个数字做一下测试,结果如下:
OK,我们的程序通过了测试。
现在对“196811234567”这串数字进行转译,结果如下:
计算机的运行速度是很快的。如果余则成活在今天会用计算机的话就再也不用人工的对密码进行转译了。
不得不说潜伏在当今这个时代已经逐渐变成了黑客的世界,余则成不光要会侦查和反侦察,还要学习必要的算法与数据结构才行。