DNA排序算法,简单来说就是通过DNA工作原理实现排序功能的算法。本篇文章从整合排序算法的角度切入这个算法。
首先,收集现有的经典排序算法,它们分别有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。
然后,通过某种方式对它们进行归类,从搜索的结果来看,可将它们分成基于比较的排序算法和基于分配的排序算法两大类,分类如下:

再就是找到一个视角,描绘这些算法的共同之处,为下一步的整合铺路。这个视角如同动画的关键帧,起到以点带面的作用。在这里,它就是反映算法分类的关键性符号,基于比较的排序算法为"<"或“>” ,基于分配的排序算法为“=”,图示如下:

最后通过DNA这个构件将这两大类算法整合在一起,产生一个新的算法。这个新的算法(DNA排序算法),运用了比较,也运用了分配,集大成者,在均衡排序效率和消耗资源上更加游刃有余。
那么,具体如何整合的呢?
首先,要弄明白排序是什么。对它的理解方式决定了算法的实现原理,在这里,排序就是将数据连接的能力从无数可能性降为唯一性的过程,图示如下:

然后,依照DNA的结构,给出一个整体的排序思路。这个思路就是将数据限定在两条数组(两条链)上,按照某种规则不停地上窜下跳,当它最终停止跳动的时候,数据成为一个有序数列。

再就是深入了解DNA运作的每一个细节,从中挖掘出与排序相关的DNA运作细节,找到实现排序的方法。从基于比较的排序算法来看,数据就是不断被基准点分隔,使数据可连接性变差,最终变成唯一性,从而实现排序;从基于分配的排序算法来看,数据不断地被分组,经过多轮分组,最终无组可分,从而实现排序。这两类排序算法,本质还是通过隔断数据的连通性来实现排序,不同之处在于它们的关注点,一个关注分隔点,一个关注数据本体。在排序过程中,一个看到分隔点不断增加,一个看到数据被不断隔断,它们都是对同一个排序过程的描述:

那么,从DNA运作的角度来看,DNA的复制过程就和数据排序过程对应上了:

最后,将数据排序的每一个细节对应上DNA的复制过程就可以得到DNA排序算法啦。
下面就让我详细说说这个对应过程。
1,将数据分成a链和b链,向DNA的双链结构靠拢:

2,数据的处理是基于CPU 或者GPU 的,从CPU的角度来看,排序大概就是对数据分层,然后一层一层历遍的过程:

3,前面两步结合起来看就是一个将数据不断拆分和重组的过程,结合DNA,图示如下:

4,单从数据的角度看,前面的步骤,把数据里的每个数都分成了好几层,而且每一层的每一组都只能拆分出两组,这两点结合起来,正好与二进制数据特点相吻合,这也就说明了这个算法可以直接利用内存里的二进制格式数据,不需要数据转换步骤:

5,通过上面几个步骤,一个排序的流程就形成了,先历遍数据得到某个数据层的”0“”1“状态值,然后将状态值为”0“的数据依次放入a链,状态值为”1“的数据依次放入b链,最后将a链与b链连接得到排序过的数据,重复上面的步骤,历遍所有数据层,数据就排好序了,图示如下:

6,有了流程图,就可以进行编程啦。不过,看到排序流程的第一步就蒙B了,先历遍数据得到某个数据层的”0“”1“状态值,这就需要一个数据长度的内存来存放这些状态值,内存开销太大了。这就需要优化排序流程以适合算法的设计要求。这里优化的方法就是用变量代表状态值,具体优化如下:

7,接下来的步骤,马上就遇到之前欠考虑的问题,a链和b链分成多组之后 ,在下个数据层里,不知道它们的对应关系了,这就是需要在数据链分成a链和b链的时候,把它们的数据坐标信息保存起来,那么,在DNA运作里, “将数据坐标信息保存起来”这个动作代表的是什么呢? 如果对应不上,那么这个算法也就不能称之为DNA排序算法了,感觉命悬一线,所有努力都要灰飞烟灭了。不过还好,搜索DNA找不到答案,搜索RNA就找到答案了,RNA是DNA的信使,哈~

关于RNA的信息很多,选取我们需要的即可:”RNA是遗传信息的中间载体,携带着三联体密码子“,从编程的角度来翻译这句话,意思就是带有三个属性的对象,也就是说,用三个属性记录一个数据组的坐标信息,让下一个数据层可以继续排序。那么,这三个属性分别就是数据组始点,数据组大小和所要排序的数据层了。有了这三个信息,数据的排序就可以顺利地进行下去了,而且数据的历遍方式发生了很大的变化,之前以数据层为单位,要历遍所有数据才能排序下一个数据层;现在以数据组为单位,历遍一个数据组就可以通过三联体对象中的一个对象从任何一个数据组开始。从工作的角度来看,三联体对象就是一个个的工作任务,而且是没有先后顺序的任务。任务没有先后顺序,分配起来就非常的方便。从编程的角度来说,这个算法就非常适合多线程运行,从而它会有很好的排序效率。

8,经过第7点的调整,DNA排序算法已经可以排序啦,现在就是到处看看哪里还需要调优的,把它调到最优。 第一,数据的数值可能会集中在某个区域,从数据层的角度来看,会有很多全是“0”的层,历遍它是做无用功,调优的方式就是利用比较的方式找出数据的最大值,然后,从这个值的最高层开始历遍数据层。第二,数据可能集中在某个区域,从而有很多是重复的。一遍一遍历遍这些相同的数也是做无用功,所以改进的方法是申请一个变量,在历遍数据层的时候也顺便比较一下这些数是否相同,只要有一个不相同就将变量值设为false,在生成三联体对象就可以根据这个值确定是否生成三联体对象,不过如果数据稀疏,这样做反而适得其反。所以还需要做进一步的改善,改善的方向就是写一个方法,在排序前判断一下当前数据是稀疏还是稠密。第三,当数据组只剩下两个数的时候就再不需要生成三联体对象,直接用比较的方式,将它们排好即可。大概就是这些了吧,这些调整,是否和DNA对应得上,这就不清楚了,不过也无伤大雅就是啦~

经过上面8步,一个完整的DNA排序算法就做出来了。
具体代码实现看这里:《DNA排序算法–代码》

DNA排序算法--图文相关推荐

  1. 八大排序算法图文讲解

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

  2. 8大排序算法图文讲解

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

  3. 8大排序算法图文讲解转

    本文链接:http://www.cricode.com/3212.html 作者:快课网--Jay13  转载请务必保留作者出处,谢谢! 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中 ...

  4. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  5. DNA排序算法--代码

    并行运算版 package dna;import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAct ...

  6. php和python的选择排序算法,图文讲解选择排序算法的原理及在Python中的实现

    def sort_choice(numbers, max_to_min=True): """ 我这没有按照标准的选择排序,假设列表长度为n,思路如下: 1.获取最大值x, ...

  7. 经典排序算法(12)——总结

    一.排序算法简介 排序算法(Sorting algorithm)是一种能将一串数据,依照特定排序方式(依照其中的某个或某些关键字的大小)进行排列的一种算法. 常见的排序算法有:交换排序(冒泡排序.快速 ...

  8. 涨姿势,图文带你了解 8 大排序算法

    转载自   涨姿势,图文带你了解 8 大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问 ...

  9. 图文+动画讲解排序算法总结!!

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 大数据肌肉猿 责编 | 阿秃 很多同学算法零基础,我都不建议他们直接去刷「剑指offer」和「LeetCode」,可以从常见的查找和 ...

最新文章

  1. Linux 内核代码行数达到 2700 万行量级
  2. 如何查询土地规划用途_一秒辨别“三无产品”,护肤品的猫腻如何发现?
  3. SpringBoot入门到精通_第7篇 _必知必会总结
  4. 【WCF】服务并发中的“可重入模式”
  5. 【C语言】中的版本规范(C89 C99等)
  6. ASP.NET - Eval使用自定义的方法
  7. 全国计算机一级试题重难点,全国计算机等级考试一级MS选择题(重难点)部分.doc...
  8. 找不到Share Project(Subversion)_android studio
  9. 多媒体计算机技术的核心技术是,多媒体计算机技术与教学
  10. Predictably Irractional - 所有权的高昂代价
  11. CANTest软件安装成功经验
  12. 数据结构导论 — (自考)
  13. 网站小图标 (favicon) 的正确设置
  14. 解读:大数据分析及其数据来源
  15. 苍穹官网页html多功能源码纯HMTL
  16. visio如何关闭预览时的缩略图
  17. R语言用Rshiny探索lme4广义线性混合模型(GLMM)和线性混合模型(LMM)
  18. 文件存档、加密和解密
  19. 多个excel合并成一个excel的sheet
  20. 输出100以内所有含7或7的倍数的值

热门文章

  1. JS判断日期是否超过六个月
  2. 计算机教学反思杂文,学无止境_教学反思_教学随笔
  3. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式 详解
  4. 奇妙而又有趣的密码学
  5. 多线程总结:1.线程的创建于开启 2.线程的状态 3.线程安全
  6. 机理模型和非机理模型
  7. 考研复试英语介绍计算机专业,2018计算机考研复试英语自我介绍范本及重点
  8. 详解ArcGIS (Pro)面积制表(区域制表)参数设置及报错处理
  9. 未来教育计算机二级c语言jd,逻辑思维训练地址_未来教育中心
  10. Markdown一键转换到富文本格式