Created
October 17, 2013 19:37
-
-
Save Rag0n/7030908 to your computer and use it in GitHub Desktop.
Python 3Sum problem using radix sort
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
def radixSort(a, n, maxLen): | |
''' | |
Цифровая сортировка: | |
a - array | |
n - кол-во возможных значения одного разряда | |
maxLen - максимальное количество разрядов | |
Циклически обходим каждый разряд, | |
для каждого разряда создаем n пустых массивов. | |
В зависимости от разряда добавляем число в один из 10 массивов. | |
''' | |
for x in range(maxLen): # сколько разрядов, столько раз и обходим | |
arrays = [[] for i in range(n)] # создаем столько пустых массивов, сколько возм.знач | |
for y in a: | |
arrays[(y / 10**x) % n].append(y) # по значениям добавляем числа в определенный массив | |
a = [] | |
for section in arrays: | |
a.extend(section) # сортируются по текущему мин.разряду | |
# следующий код нужен чтобы переставить отрицательные числа вначало | |
count = 0 | |
for x in a: | |
if x < 0: | |
a = a[count:] + a[:count] | |
return a | |
count += 1 | |
def find2Sum(lst, array, x): | |
''' | |
Принимает аргумент x и ищет по алгоритму | |
2sum такой, чтобы 2 элемента были равны -x | |
''' | |
i = 0 | |
k = len(lst) - 1 | |
while i < len(lst) and k > 0: | |
if lst[i] == lst[k]: | |
return 0 | |
if lst[i] + lst[k] == -x: | |
writearray = (findIndex(x, array), findIndex(lst[i], array), findIndex(lst[k], array)) | |
writearray = list(writearray) | |
insertionSort(writearray) | |
writeIndexes(writearray) | |
return 1 | |
elif lst[i] + lst[k] > -x: | |
k -= 1 | |
elif lst[i] + lst[k] < -x: | |
i += 1 | |
def find3Sum(lst, array): | |
''' | |
Обходим все элементы в массиве, | |
для каждого элемента вызывает функцию 2sum | |
которая ищет сумма = -х | |
''' | |
count = 0 | |
for x in lst: | |
count += 1 | |
if find2Sum(lst[count:], array, x): | |
return 1 | |
def findIndex(element, array): | |
# ищет индексы найденных элементов в неотсортированном массиве | |
counter = 0 | |
for x in array: | |
if element == x: | |
break | |
counter += 1 | |
return counter | |
def insertionSort(lst): | |
''' | |
Используется чтобы отсортировать индексы | |
''' | |
for index in range(3): | |
value = lst[index] | |
i = index - 1 | |
while i >= 0 and value < lst[i]: | |
lst[i+1] = lst[i] | |
lst[i] = value | |
i -= 1 | |
def writeIndexes(writearray): | |
for x in writearray: | |
wf.write(str(x+1) + ' ') | |
wf.write('\n') | |
if __name__ == "__main__": | |
f = open("/home/rag0n/Programming/Python/Algorithms/rosalind_3sum.txt", "r") | |
wf = open('/home/rag0n/Programming/Python/Algorithms/3SUMOUT.txt', 'w') | |
nm = f.readline().rstrip().split() # получаем параметры | |
n = int(nm[0]) # кол-во массивов | |
m = int(nm[1]) # кол-во элементов в массиве | |
i = 0 | |
while i < n: | |
print('begin') | |
lst = (map(int, (f.readline().rstrip()).split())) | |
array = lst[:] # копия оригинального | |
lst = list(set(lst)) # магия, которая удаляет повторяющиеся элементы | |
lst = radixSort(lst, 10, 6) | |
if find3Sum(lst, array): | |
pass | |
else: | |
wf.write(str(-1) + '\n') | |
i += 1 | |
print('end') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment