打败算法 —— 单词的压缩编码

本文参考

出自LeetCode上的题库 —— 单词的压缩编码,这道题原本是通过字典树或是字典序的正序和逆序排序来求解,不过我在评论区看到了另外一种"桶排序"的解法,因此本篇文章讲一下下这个问题的桶排序解法

https://leetcode-cn.com/problems/short-encoding-of-words/

单词的压缩编码问题

给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A

例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]

对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表

那么成功对给定单词列表进行编码的最小字符串长度是多少呢?

 

示例:

输入: words = ["time", "me", "bell"]

输出: 10

说明: S = "time#bell#" , indexes = [0, 2, 5]

桶排序

百度百科上对桶排序有一个"浓缩"的介绍 —— 桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)

那么,最开始是如何将数组中的各个元素放到对应的桶里呢?这里放桶的方式有很多种,例如数组中元素大小介于1~ 100之间,可以定义5个桶,每个桶对应的区间大小分别为1 ~ 20(第一个桶),21 ~ 40,41 ~ 60,61 ~ 80,81 ~ 100(最后一个桶),我们在遍历数组的元素时,将该元素放到对应区间的桶内,同时保证每个桶内的元素也是有序的。所有元素放入桶后,我们遍历每个桶和每个桶内的元素,即可获得排序好的数组元素

每个桶对应的也可以不是一个区间,而是一个具体的数值或字符,在上例中我们也可以定义101个桶(下标0 ~ 100),此时只要每个桶的计数值加1就能完成排序

更加详细的介绍可以参考下面两篇文章:

https://www.cnblogs.com/bqwzx/p/11029264.html

https://zhuanlan.zhihu.com/p/52884590

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/kuluo/p/12591834.html