Zaciekawił mnie Jon Limjap's interview mishap i zacząłem szukać skutecznych sposobów na wykrywanie palindromu. Sprawdziłem odpowiedzi palindrome golf i wydaje mi się, że w odpowiedziach są tylko dwa algorytmy, odwracając ciąg i sprawdzając od ogona i głowy.Skuteczność wykrywania palindromu
def palindrome_short(s):
length = len(s)
for i in xrange(0,length/2):
if s[i] != s[(length-1)-i]: return False
return True
def palindrome_reverse(s):
return s == s[::-1]
Myślę, że żadna z tych metod nie jest używana do wykrywania dokładnych palindromów w ogromnych sekwencjach DNA. Rozejrzałem się trochę i nie znalazłem żadnego darmowego artykułu na temat tego, jaki może być ultra wydajny sposób.
Dobrym sposobem może być zrównoleglenie pierwszej wersji w podejściu dziel i rządź, przypisując parę znaków z tablic 1..n i długość-1-n..length-1 do każdego wątku lub procesora.
Jaki byłby lepszy sposób?
Czy znasz jakieś?
Zapominasz, że wyszukiwanie hash jest liniowe na długości klucza, a ponieważ obliczanie hashów używa niektórych arytmetyki, jest ono faktycznie mniej wydajne niż porównanie char-by-char. Chunking też nie pomoże, nawet jeśli się rozdzielisz, ponieważ za każdą miss będziesz miał ogromną ilość zmarnowanej pracy i jest znacznie więcej błędów niż trafień. Porównanie z centrum jest znacznie bardziej efektywne, ponieważ możesz się wcześnie wycofać. – ZXX