将字符串转换为数字(不解析)以进行基数排序

时间:2013-05-06 10:30:54

标签: python radix-sort

我有一个学校项目,我需要使用不同的排序算法对所有类型的数据类型进行排序。基数排序运行良好,但除了整数之外,它不能排序。我可能不会为除整数之外的任何内容添加排序结果,因为每种数据类型都将按整数排序。

那就是说,我想知道是否有更好的方法将字符串转换为整数?这就是我的结果。我不想超越python,并试图尽可能地使用标准功能。

def charToHex(char):
    return hex(ord(char))[2:]

def stringToHex(text):
    t = ''
    for char in text:
        t += charToHex(char)

    return t

def stringToInt(text):
    return int(stringToHex(text), 16)

print stringToInt('allo')
print stringToInt('allp')
print stringToInt('all')

它运作良好,但我很高兴知道是否有更好的方法来处理它。对于它的价值,使用基数排序除了整数之外的其他任何东西听起来毫无意义。因为即使您可以对整数列表进行排序。您必须将所有键的值恢复到列表中。

我记得要做那样的事情。对于列表中的每个值,获取一个整数键。将该密钥放在哈希表中,并将该值放在该哈希表的列表中。用整数键替换列表中的值,然后对键列表进行排序。

对于排序列表中的每个键,获取该键的值列表并弹出一个项目。将该项目放入列表中并继续。

我还想知道是否有办法优化此过程,以便使用基数排序而不是其他不需要任何转换的排序值得。列表中的项目数量可能超过50000。

修改

实际上,此处的代码不适用于不同大小的字符串。我不太确定怎么检查。用空格填充字符串似乎有效。

def getMaxLen(ls):
    lenght = 0

    for text in ls:
        lenght = max(lenght, len(text))

    return lenght

def convertList(ls):
    size = getMaxLen(ls)
    copy = ls[:]

    for i, val in enumerate(copy):
        copy[i] = stringToInt(val.ljust(size, ' '))

    return copy

print convertList(["allo", "all", "bal"])

1 个答案:

答案 0 :(得分:2)

首先,看看this article。那篇文章表明是的,在某些情况下,你可以找出比其他任何类型更快的字符串的基数排序算法。

其次,更重要的是,我会问你自己是否在做过早的优化。使用python的sort()函数对50k项进行排序将非常快。除非你确定这是你的应用程序的瓶颈,否则我不会担心它,只会使用sort()函数。如果它是一个瓶颈,我也会确保没有一点你可以避免做所有这些类型(例如缓存,处理未分类数据的算法等)。