最终,AlphaDev发现了一种全新排序算法:
如果序列较短,相比人类基准排序算法,它能将速度提高70%;如果序列长度超过25000个元素,则提高1.7%。
(3-5个元素的短序列排序其实使用非常广泛,因为它能够作为较大排序函数的一部分被多次调用。因此,只要改进了短序列,任意数量序列的整体排序速度都能得到提高。)
具体而言,该算法的创新主要在于两种指令序列:
(1)AlphaDev Swap Move(交换移动)
(2)AlphaDev Copy Move(复制移动)
他把移动数据分成了两种格式,交换移动和拷贝移动
我们以前的排序基本都是交换移动 。
.版本 2
[ /size
] [ /font
] [ /color
] [ /align
] 排序模块_代码之美快速排序 参数_数组 整数型 l 整数型 u 整数型
如果真 ( l ≥ u
) 返回 ( ) 交换变量 ( 参数_数组
[ l
] , 参数_数组
[ 取随机数 ( l, u
) ] ) m = l
变量循环首 ( l + 1, u, 1, i
) 如果真 ( 参数_数组
[ i
] < 参数_数组
[ l
] ) m = m + 1
交换变量 ( 参数_数组
[ m
] , 参数_数组
[ i
] ) 变量循环尾 ( ) 交换变量 ( 参数_数组
[ l
] , 参数_数组
[ m
] ) 排序模块_代码之美快速排序 ( 参数_数组, l, m - 1
) 排序模块_代码之美快速排序 ( 参数_数组, m + 1, u
)
.子程序 排序模块_代码之美快速排序, , 公开, 参数L 填写第一个成员,U 填写最后一个成员 (数组,1,取数组成员(数组)的样子)
.参数 参数_数组, 整数型, 数组
.参数 l, 整数型, , 左
.参数 u, 整数型, , 右
.局部变量 i, 整数型
.局部变量 m, 整数型, , , 基准
.如果真 (l ≥ u)
返回 ()
.如果真结束
交换变量 (参数_数组 [l], 参数_数组 [取随机数 (l, u)])
m = l
.变量循环首 (l + 1, u, 1, i) ' 这里是 i++ 的意思
.如果真 (参数_数组
< 参数_数组 [l])
m = m + 1 ' - ++x 是要先加,然后再使用,x++ 则是先用X,然后再加1
交换变量 (参数_数组 [m], 参数_数组 )
.如果真结束
.变量循环尾 ()
交换变量 (参数_数组 [l], 参数_数组 [m])
排序模块_代码之美快速排序 (参数_数组, l, m - 1)
排序模块_代码之美快速排序 (参数_数组, m + 1, u)
简单来说,交换移动就是三步 A B 两个交换位置,就得加上一个 临时值。
临时值= a a= b b =临时值 三步来完成交换
而AI想出来的一步,简直神了,堪比虚竹随便下的一步盘活了珍珑棋局
增加了 拷贝移动 ,增加了一个维度,只要算法设计得当
假如A想移动到第26个数组值。直接 一步到位Z= A 。 至于原来的Z ,可以直接存起来,用来后面拷贝到哪里去。
移动汇编的话 最基本就减少三分之一的移动执行代码。只要移动两趟就能交换完数据
重现当年AlphaGo神来之笔!DeepMind新AI发现提速70%排序算法,十年都没更的C++库更新了
作者:量子位