Kata11:一桶天下

Kata11地址

这次的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行的文件进去也需要计算很长时间才能找到位置。。。

我想说的是,这个想法绝对是颠覆性的,计算能力在不断提升,科学也在不断发展,一旦未来我们能快速找出数据位置,那存储就再也不是难题。到那时我们将拥有近乎无限的数据存储空间,所有的数据都在π中,所以无论文件有多大,我们的系统只需要存储它在π中的位置和长度这两个字段即可。

当时看到这个项目的时候我非常激动,这种看到未来的感觉,我相信你们也会喜欢的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容