这次的Kata是老生常谈的——————排序。
在算法领域中,排序的知名程度大概仅次于a+b和二分(别问我为什么a+b是算法),这么多年以来涌现出了许多经典牛逼的排序算法,比如冒泡、插入、堆排、桶排、快排、二叉树等等,再加上各种变体,基本该研究的已经被大家研究完了。
不过在真正的工作中,我们很少会自己写排序,一般都是直接用库函数,这个Kata的目的就是让大家练习一下排序算法
。。。。。。
。。。。
。。
你信吗?
还是那句话,以这个作者的尿性就不可能是纯算法题,我们来看看到底是怎么回事。
题目1
题目1简单来说就是对整数排序,整数的范围是0~59。
题目2
题目2简单来说就是对字母排序,a~z,所有大写字母全部转成小写。
一桶天下
作者要求用最高效的算法,看完这俩题目就明白了,桶排嘛!
很多人以为冒泡是最简单的排序算法,错,最简单的排序算法其实是桶排。那么什么是桶排呢?
桶排,简单来说就是把所有可能出现的数据按顺序分成一个一个桶,比如a~z就是26个桶,拿到输入数据之后放到对应的桶里,最后输出排序结果的时候按顺序遍历桶,如果有内容就输出,没有就跳过。
桶排还有一个特点————它是所有算法里面排序效率最高的,高到什么程度呢————O(1),你敢信?O(1)的排序啊哈哈哈哈。
优点这么明显,缺点自然也不少。
桶排首先要求输入数据必须是离散的,而且要提前知道所有可能数据的排序,并且需要非常大的存储空间,这个空间大致来说和输入数据的可能范围成正比。也就是说,桶排是非常极端的空间换时间。
在这两个题目中,输入数据的范围非常之小,所以用桶排那是再合适不过了。
代码
代码依然简单
class BucketSort:
def __init__(self, originList):
self.originList = originList
self.countList = [0 for i in range(len(originList))]
def add(self, item):
if type(item) == type(""):
item = item.lower()
elif type(item) != type([]):
item = [item]
for i in item:
self.countList[self.originList.index(i)] += 1
def result(self):
for i in range(len(self.originList)):
for j in range(self.countList[i]):
print str(self.originList[i]),
print
test = BucketSort([chr(i) for i in range(97, 123)]) # 生成a~z个桶,chr是把ASCII码转换成字符
test.add('asdsadasdqwewqedzs')
test.result()
test.add('ASDIHJOIHCJKXHK')
test.result()
这里进行了抽象,同一个类可以解两道题。
题外话
桶排的限制有两点,离散值和空间。离散值就不说了,这是硬伤,但是空间在未来可能不再是限制。
来看一个GitHub上的项目pifs,这个项目名字翻译过来就是π文件系统,我简单解释一下。
π是一个无限不循环小数,它还有一个特性就是平凡,意思是0~9这九个数字在π中出现的概率相同,这点已经被证明过了。
大家都知道,计算机中的各种数据本质上都是二进制,所以可以转换成10进制,由于π是无限不循环的,所以理论上任何,注意我说的是“任何”数据,都可以在π中找到一模一样的一段。
也就是说,π里面包含所有我们用到和没用到的数据,包含windows,包含Linux,也包含你电脑上的任意一个文件。
但是如果把π看作一个文件系统,会有两个问题:读和写。
先说写,写的意思就是给定一段数据,找到这段数据在π中出现的位置以及长度,这个问题其实是π文件系统的核心问题,由于π是无限不循环,计算速度有限,所以找到位置目前来说非常困难。
再说读,读就简单多了,假设已经知道数据出现的位置和长度,可以直接进行计算。之所以不用一位一位算下去,是因为有一个牛逼的数学家提出了一个牛逼的公式,可以直接计算π的第n位,跳过前n-1位。
前面说的GitHub项目,就是实现了一个简单的π文件系统,已经可以使用了哦,只不过据作者说,存一个400行的文件进去也需要计算很长时间才能找到位置。。。
我想说的是,这个想法绝对是颠覆性的,计算能力在不断提升,科学也在不断发展,一旦未来我们能快速找出数据位置,那存储就再也不是难题。到那时我们将拥有近乎无限的数据存储空间,所有的数据都在π中,所以无论文件有多大,我们的系统只需要存储它在π中的位置和长度这两个字段即可。
当时看到这个项目的时候我非常激动,这种看到未来的感觉,我相信你们也会喜欢的。