2013-05-06 7 views
0

У меня есть школьный проект, где мне нужно сортировать все типы данных с различными алгоритмами сортировки. Сорт Radix работает хорошо, но он не может сортировать ничего, кроме целых. Вероятно, я не собираюсь добавлять результаты сортировки для чего-либо еще, кроме целого числа, поскольку каждый тип данных будет отсортирован как целые числа.Преобразование строк в числа (без разбора) для сортировки radix

Это было сказано, Я хотел бы узнать, есть ли лучший способ преобразования строк в целые числа? Вот что я пришел. Я не хотел перехитрить 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') 

Это хорошо работает, но я был бы рад узнать, есть ли лучший способ справиться с этим. Для того, что это стоит, сортировка чего-либо другого, кроме целых чисел с сортировкой radix, бессмысленна. Потому что даже если вы можете отсортировать список целых чисел. Вам нужно будет вернуть значения для всех ключей в список.

Я имел в виду сделать что-то подобное. Для каждого значения в моем списке получите целочисленный ключ. Поместите этот ключ внутри хэш-таблицы и значение в списке для этой хеш-таблицы. Замените значение в списке целым ключом, а затем отсортируйте список ключей.

Для каждого ключа в отсортированном списке получите список значений для этого ключа и поместите один элемент. Поместите этот элемент в список и продолжайте.

Я также хотел бы знать, есть ли способ оптимизировать этот процесс, чтобы сделать его полезным, используя сортировку radix, а не другую сортировку, которая не требует никакого преобразования. Количество элемента в списке может выйти за пределы 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"]) 

ответ

2

Во-первых, взгляните на this article. В этой статье показано, что да, в некоторых случаях, вы можете найти алгоритм сортировки радиуса для строк, который быстрее, чем любой другой вид.

Во-вторых, и что еще более важно, я бы спросил себя, если вы делаете преждевременную оптимизацию. Сортировка 50 тыс. Элементов с функцией sort() python будет невероятно быстрой. Если вы не уверены, что это узкое место в вашем приложении, я бы не стал беспокоиться об этом и просто использовал бы функцию sort(). Если это узкое место, я также удостоверился, что вы не сможете избежать всех этих видов (например, кеширование, алгоритмы, которые работают с несортированными данными и т. Д.)

+0

+1 для ссылки на статью , хорошо читать! –

Смежные вопросы