当前课程知识点:数据结构(下) > 第十二章 排序 > (c2)希尔排序:逆序对 > 12c2-1: 邮资问题
我们此前曾经讲到希尔排序
在对矩阵逐列排序时
所使用的算法本身未必需要十分高效
而更重要的是应该具有输入敏感的特性
因此我们更倾向于使用插入排序
那么这背后的具体原因又当如何解释呢
这里的核心依然是逆序对
让我们从所谓的邮资问题开始
假设在某个国家寄送一封平信
需要五毛钱
而寄送一张明信片只需三毛五
进一步的我们假设在这个国家
所发行的邮票只有面值为四分
以及一毛三的两种
那么如果你需要邮寄一封平信
或者明信片
你是否能够恰好用这两类邮票
凑出所对应的邮资呢?稍作思考之后
我想你不难找出平信所对应的
邮资方案
是的
正如这幅图所画的那样
我们只需六张面额为四分的邮票
外加两张面额为一毛三的邮票
就恰好可以凑出平信所对应的邮资
也就是五毛钱
然而对于明信片我想你会和我一样
无论如何苦思冥想
也不能找出一种恰好的邮资方案
如果你感兴趣甚至可以编写几行
简单的代码来穷举所有的可能
你将会发现
在这个国家的确无法贴出
明信片所对应的邮资三毛五
由此我们可以看到使用特定的一组邮票
对于有些邮资
我们可以恰好的凑出
而有些邮资无论如何都不能恰好的凑出
那么为什么会有这样的区别呢
对于其他的邮资而言
我们又有什么样的一般性规律呢
翻译成数学的语言
我们可以说在这个国家
用四分和一毛三面额的邮票
所能凑出的邮资
必然是4m加上13n的形式
这一个由整数相乘然后累加
而形成的表达式
也称作线性组合linear combination
当然我们也可以将以上的邮资问题
推而广知
比如分别用g和h来代表两种邮票的面额
而用m和n分别代表这两类邮票
所使用的数量
于是由m枚面额为g的邮票
以及N枚面额为h邮票
所共同构成的邮资
就可以表示为这样一个形式
也就是更一般意义上的
linear combination
不难理解通过线性组合
我们的确可以凑出不同的邮资
但是正如我们已经看到的
有些邮资却总是无法凑出
实际上我们更加关注于后一类的邮资
对于面额特定的两枚邮票
我们不妨将所有不能由他们凑出的邮资
汇成一个集合并记作ngh
我们最为关注的是这个集合中的
最大(值)
我们将其记作xgh
那么对于任何一对互素的g和h
x又是多少呢
在此我们直接引述数论中的现成结论
数论告诉我们说
xgh应该等于g减1与h减一的乘积
再减一
当然你可以化简为很多别的形式
比如说g和h的乘积
再减去g和h的和
我们不妨就刚才的实例来做一个验证
也就是说在g等于4h等于13时
按照这个定理
x应该等于4和13的乘积
再减去4和13的总和
不出意外恰好就是35
也就是刚才明信片所对应的邮资
当然这个定理也告诉我们
从三毛六开始向上
所有的面额都是可以由
这两种邮票凑出的
只要这两种邮票足够多
这样一个邮资的问题
虽然有趣但是它于我们这里的
希尔排序又有什么关系呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试