Nel Ashton String task, l'obiettivo è quello di:Superamento MemoryError/runtime Slow compito Ashton String
Disporre tutte le sottostringhe distinti di una determinata stringa in lessicografico e concatenare. Stampa il carattere Kth di la stringa concatenata. È assicurato che il valore dato di K sarà valido cioè ci sarà un carattere Kth.
Il Input Format
:
prima riga contiene un numero T cioè numero di casi di test. Prima linea di ogni test conterrà una stringa contenente caratteri (a-z) e seconda riga contiene un numero K.
Il Output Format
:
Print carattere Kth (la stringa è 1 indicizzati)
E il Constraints
sono
1 ≤ T ≤ 5
1 ≤ lunghezza ≤ 105
K sarà un numero intero appropriato.
Ad esempio, dato l'input:
1
dbac
3
Il risultato sarebbe: c
Ho tentato il compito con questo codice e funziona per relativamente brevi stringhe:
from itertools import chain
def zipngram(text, n=2):
words = list(text)
return zip(*[words[i:] for i in range(n)])
for _ in input():
t = input()
position = int(input())-1 # 0th indexing
chargrams = chain(*[zipngram(t,i) for i in range(1,len(t)+1)])
concatstr = ''.join(sorted([''.join(s) for s in chargrams]))
print (concatstr[position])
Ma se il file di input è simile al seguente: http://pastebin.com/raw/WEi2p09H e l'output desiderato è:
l
s
y
h
s
L'interprete lancerà una MemoryError
:
Traceback (most recent call last):
File "solution.py", line 11, in <module>
chargrams = chain(*[zipngram(t,i) for i in range(1,len(t)+1)])
File "solution.py", line 11, in <listcomp>
chargrams = chain(*[zipngram(t,i) for i in range(1,len(t)+1)])
File "solution.py", line 6, in zipngram
return zip(*[words[i:] for i in range(n)])
File "solution.py", line 6, in <listcomp>
return zip(*[words[i:] for i in range(n)])
MemoryError
Come può la MemoryError essere risolto? È risolvibile in un altro modo usando Python2 o Python3 nativi?
ho cercato di risolvere il MemoryError
potando stack utilizzando heapq
ma ora va in un super lento runtime spingendo e iniziano mucchio invece di prendere troppa memoria.
from itertools import chain
import heapq
t = int(input())
s = list(input())
k = int(input())
stack = []
for n in range(1,len(s)+1):
for j in range(n):
ngram = (''.join(s[j:]))
ngram_len = len(ngram)
# Push the ngram into the heapq.
heapq.heappush(stack, ngram)
pruned_stack = []
temp_k = 0
# Prune stack.
while stack != [] and temp_k < k:
x = heapq.heappop(stack)
pruned_stack.append(x)
temp_k+=len(x)
# Replace stack with pruend_stack.
stack = pruned_stack
print (''.join(chain(*pruned_stack))[k])
C'è un modo per bilanciare tra non usare troppa memoria che porta a MemoryError
e troppo lento runtime con heapq
spingere e popping?
Puoi provare questo input: http://pastebin.com/raw/WEi2p09H? Passa anche a MemoryError? – alvas
@alvas si prega di provare il mio codice, non ottiene errore di memoria e restituisce i risultati giusti –
Pazienza, è necessario disporre. vieni, lo faranno, il voto quando si avvicina, la taglia è. – alvas