I am trying out the stable marriage problem in SPOJ in Python3. I have tried optimising the code as much as I can (remove slicings, keep minimal array, remove printing one by one, etc). But by far the best code I have been able to get runs in 0.13(s?) time and 33M(??) memory. But the best code for the same problem in Python3 (submitted by @_@) runs in 0.09 time and 13M memory. So I would like suggestions on how to attain the best time and space usage with my code
from sys import stdin, stdout def findWoman(manArray, womanArray, index, mpref, wpref): for woman in mpref[index - 1]: if(woman == 0): continue hub = womanArray[woman - 1] if(hub == 0): womanArray[woman - 1] = index manArray[index - 1] = woman return 0 elif(wpref[woman - 1].index(index) > wpref[woman - 1].index(hub)): continue else: manArray[hub - 1] = 0 womanArray[woman - 1] = index manArray[index - 1] = woman return hub out = '' t = int(stdin.readline()) while(t > 0): t -= 1 n = int(stdin.readline()) mpref = [] wpref = [] for _ in range(0, n): w = list(map(int, stdin.readline().split())) w[0] = 0 wpref.append(w) for _ in range(0, n): m = list(map(int, stdin.readline().split())) m[0] = 0 mpref.append(m) manArray = [0 for _ in range(n)] womanArray = [0 for _ in range(n)] for k in range(n): hub = k + 1 while(hub != 0): hub = findWoman(manArray, womanArray, hub, mpref, wpref) for k in range(n): out += str(k + 1) + ' ' + str(manArray[k]) + '\n' stdout.write(out)
Thank you in advance