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

关键字: 算法, 排序, 列表

[饭后算法系列] "头尾移动" 排序列表的更多相关文章

  1. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

  2. 算法系列:Shell 排序

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  3. [饭后算法系列] 数组中"和非负"的最长子数组

    1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...

  4. 数据结构与算法系列——排序(4)_Shell希尔排序

    1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...

  5. 三白话经典算法系列 Shell排序实现

    山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...

  6. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  7. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  8. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  9. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

随机推荐

  1. VSS Get Latest Version 没有提示recursive的对话框解决

    今天按照VSS使用时,当“Get Latest version”时,不小心勾选了 “Only show this dialog when the Shift key is down”,因此当我再“Ge ...

  2. Spring MVC中使用Mongodb总结

    近期项目做了次架构调整,原来是使用MySQL+GeoHash来存储LBS数据(地理位置信息),现在使用NOSQL数据库MongoDB来存储LBS数据(地理位置信息).由于项目是基于spring MVC ...

  3. mongodb一些特性

    mongodb 地理位置 mongodb schema mongodb 定时任务 mysql 也有定时任务 mongodb 读写分离 http://blog.csdn.net/sd0902/artic ...

  4. ORACLE复制数据库【weber出品】

    一.概述 在公司中,我们会经常面临着一种情况.我们制定了对数据库的操作方案后,还不可以在真正的数据库上执行,需要在备用数据库进行测试,这个时候就需要备用数据上的数据和真正数据库的数据是一模一样的.我们 ...

  5. 洛谷 P1316 丢瓶盖

    P1316 丢瓶盖 题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以 ...

  6. Ubuntu 安装之后的配置博文总结

    由于频繁地在各种机器上给别人安装ubuntu,每次安装之后都需要进行一些配置,现在以ubuntu12.04为例,就他人的一些配置博文总结如下: 1. Ubuntu安装中文输入法 http://www. ...

  7. 狗狗40题~ (Volume C)

    A - Triangles 记忆化搜索呗.搜索以某三角形为顶的最大面积,注意边界情况. #include <stdio.h> #include <cstring> #inclu ...

  8. 移植openssh到nuc951 evb板

    移植openssh到nuc951 evb板 一 应用环境: 硬件:nuc951evb 软件:linux2.6.35 bsp 二 交叉编译openssl openssh 1.下载 openssl-1.0 ...

  9. Spring4.0学习笔记(4) —— 使用外部属性文件

    1.配置xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  10. VS2010 IE10 调试时报“未能将脚本调试器附加到计算机”,已经附加了一个进程

    解决办法:以管理员身份打开CMD,运行:regsvr32.exe "%ProgramFiles(x86)%\Common Files\Microsoft Shared\VS7Debug\ms ...