Skip to content

Instantly share code, notes, and snippets.

@Rag0n
Created October 17, 2013 19:37
Show Gist options
  • Save Rag0n/7030908 to your computer and use it in GitHub Desktop.
Save Rag0n/7030908 to your computer and use it in GitHub Desktop.
Python 3Sum problem using radix sort
# -*- 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