[饭后算法系列] "头尾移动" 排序列表
1. 问题
一个乱序列表(list), 只支持两种操作: 把一个元素移动到头部, 或者把一个元素移动到尾部. 需要设计一种算法, 使得移动次数最少而使列表有序
举两个例子:
1. {3,5,7,1,9,10,8}. 最少需要移动3次: 1移动到头部, 9移动到尾部, 10移动到尾部
2. {6,5,4,3,2,1}. 最少需要移动5次: 将2,3,4,5,6依次移动到尾部, 或者将5,4,3,2,1依次移动到头部
2. 分析
这题和其他算法不一样的地方在于求严格的最优移动次数, 而不是移动次数的复杂度, 也不要求整体算法的复杂度, 因此只要考虑怎么最小化移动次数即可
3. 暴力法
暴力法是算法的一个标杆, 表明了"最差"的算法需要移动多少次, 这可以给我们思考最优算法提供一个直观的界线
拿这道题目来说, 用暴力法怎么解用例1中的{3,5,7,1,9,10,8}?
我们可以无视任何优化, 简单地把列表中最小的数字(1)移动到尾部, 再将次小的数字(3)移动到尾部, 这样依次将5,7,8,9,10移动到尾部, 就完成了整个列表的排序, 总共需要移动n次, n为列表的元素个数.
也就是说, 对于一个最优算法, 移动次数一定是小于n的
4. 算法优化
4.1 标准化
根据暴力法我们可以发现, 我们需要知道每个数字在列表中的大小关系, 也就是需要知道1是最小的, 3是次小的
所以我们需要把列表标准化, 标准化后的列表元素, 是原列表元素从小到大的序号. 即3在原数组中第2大, 所以3标准化为2. 以此类推, 用例1标准化为: {2,3,4,1,6,7,5}
下面所有的操作都针对标准化后的列表
4.2 算法主体
1. 找到列表中最长的 '步进1递增子序列', 比如用例一中的2,3,4,5. 注意这里一定要步进为1, 所以虽然2,3,4,6,7是最长的递增子序列, 但是4->6的步进不为1, 所以不考虑
2. 假设找到的最长步进1递增子序列为 i, i+1, ..., j, (长度为k) 那么剩下的工作就是把其他元素归位:
2.1 依次把 i-1, i-2, ..., 1移动到头部
2.2 依次把 j+1, j+2, ..., n移动到尾部
总共的移动次数为 n-k
关键字: 算法, 排序, 列表
[饭后算法系列] "头尾移动" 排序列表的更多相关文章
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
- 算法系列:Shell 排序
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- [饭后算法系列] 数组中"和非负"的最长子数组
1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...
- 数据结构与算法系列——排序(4)_Shell希尔排序
1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...
- 三白话经典算法系列 Shell排序实现
山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...
- 数据结构和算法(Golang实现)(25)排序算法-快速排序
快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...
随机推荐
- Visual Studio 2012 Ultimate 上安装 Python 开发插件 PTVS
1.我的环境 操作系统:32位 Win7 旗舰版 Service Pack 1 VS版本:Microsoft Visual Studio Ultimate 2012 版本 11.0.50727.1 R ...
- asp.net微信开发第六篇----高级群发(文本)
说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...
- iOS实现OAuth2.0中刷新access token并重新请求数据操作
一.简要概述 OAuth2.0是OAuth协议的下一版本,时常用于移动客户端的开发,是一种比较安全的机制.在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的r ...
- C#基础学习第三天(.net菜鸟的成长之路-零基础到精通)
1.复合赋值运算符 += -= *= /= %= 2.关系运算符 > < >= <= == != 由关系运算符连接的表达式我们称之为关系表达式. 每一个表达式都可以求解出 ...
- QT5控件-QDateTimeEdit和类QDateTime
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDateTime> #i ...
- C++拾遗(七)函数相关(2)
内联函数 内联函数与常规函数的区别在于: 1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放 入寄存器,最后跳回到一 ...
- nginx_笔记分享_配置篇
参考http://www.howtocn.org/nginx:directiveindexhttp://blog.s135.com/ nginx 配置文档为 nginx.conf 比如我的配置文档 / ...
- 【创建型】Singleton模式
单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...
- ios对SQLite3的使用
ios对SQLite3的使用 一.在Firefox中打开sqlite3(如果没有,选择工具->附加组件,添加即可)新建sqlite3数据库,Contacts, 建立一个members表,字段 i ...
- 转:Raspberry Pi(树莓派)试用小记
近期入手一树莓派卡片机,体验了一下它的强大,写篇报告,推广一下哈! 机器截图: 基础参数: CPU:700 MHz, ARM11 内存:512M(还有一种是256M的) 支持GPU加速(高清视频无压力 ...