Форум сайта python.su
-1
Помогите реализовать алгоритм вагнера-фишера пожалуста
Офлайн
61
Легко.
Где у вас ошибка? На чем застряли? покажите код?
Что пишет лог?
Офлайн
-1
def wagner_fisher(s1, len_s1, s2, len_s2): d = {} if len_s1 > len_s2: s1, s2 = s2, s1 len_s1, len_s2 = len_s2, len_s1 for i in range(-1, len_s1 + 1): d[(i, -1)] = i + 1 for j in range(-1, len_s2 + 1): d[(-1, j)] = j + 1 for i in range(len_s1): for j in range(len_s2): if s1[i] == s2[j]: d[i, j] = d[i - 1, j - 1] else: d[(i, j)] = min( d[(i - 1, j)] + 1, d[(i, j - 1)] + 1, d[(i - 1, j - 1)] + 1, ) return d[len_s1 - 1, len_s2 - 1] def levenshtein(s1, s2): if len(s1) < len(s2): return levenshtein(s2, s1) if len(s2) == 0: return len(s1) previous_row = range(len(s2) + 1) for i, c1 in enumerate(s1): current_row = [i + 1] for j, c2 in enumerate(s2): insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) current_row.append(min(insertions, deletions, substitutions)) previous_row = current_row return previous_row[-1] def LD(s,t): s = ' ' + s t = ' ' + t d = {} S = len(s) T = len(t) for i in range(S): d[i, 0] = i for j in range (T): d[0, j] = j for j in range(1,T): for i in range(1,S): if s[i] == t[j]: d[i, j] = d[i-1, j-1] else: d[i, j] = min(d[i-1, j], d[i, j-1], d[i-1, j-1]) + 1 return d[S-1, T-1] def lev(a, b): if not a: return len(b) if not b: return len(a) return min(lev(a[1:], b[1:])+(a[0] != b[0]), lev(a[1:], b)+1, lev(a, b[1:])+1) def levenshtein(s, t): if s == t: return 0 elif len(s) == 0: return len(t) elif len(t) == 0: return len(s) v0 = [None] * (len(t) + 1) v1 = [None] * (len(t) + 1) for i in range(len(v0)): v0[i] = i for i in range(len(s)): v1[0] = i + 1 for j in range(len(t)): cost = 0 if s[i] == t[j] else 1 v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost) for j in range(len(v0)): v0[j] = v1[j] return v1[len(t)] def levenshtein2(source, target): import numpy as np if len(source) < len(target): return levenshtein(target, source) if len(target) == 0: return len(source) source = np.array(tuple(source)) target = np.array(tuple(target)) previous_row = np.arange(target.size + 1) for s in source: current_row = previous_row + 1 current_row[1:] = np.minimum( current_row[1:], np.add(previous_row[:-1], target != s)) current_row[1:] = np.minimum( current_row[1:], current_row[0:-1] + 1) previous_row = current_row return previous_row[-1]
Офлайн
857
Qwerty16Этот самый быстрый
но которая правильная из них
def lev(s, t): if s == t: return 0 elif len(s) == 0: return len(t) elif len(t) == 0: return len(s) v0 = [None] * (len(t) + 1) v1 = [None] * (len(t) + 1) for i in range(len(v0)): v0[i] = i for i in range(len(s)): v1[0] = i + 1 for j in range(len(t)): cost = 0 if s[i] == t[j] else 1 v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost) for j in range(len(v0)): v0[j] = v1[j] return v1[len(t)]
def lev(a, b): if not a: return len(b) if not b: return len(a) return min(lev(a[1:], b[1:])+(a[0] != b[0]), lev(a[1:], b)+1, lev(a, b[1:])+1)
import numpy as np def lev(source, target): if len(source) < len(target): return lev(target, source) if len(target) == 0: return len(source) source = np.array(tuple(source)) target = np.array(tuple(target)) previous_row = np.arange(target.size + 1) for s in source: current_row = previous_row + 1 current_row[1:] = np.minimum( current_row[1:], np.add(previous_row[:-1], target != s)) current_row[1:] = np.minimum( current_row[1:], current_row[0:-1] + 1) previous_row = current_row return previous_row[-1]
def lev(s1, s2): if len(s1) < len(s2): return lev(s2, s1) if len(s2) == 0: return len(s1) previous_row = range(len(s2) + 1) for i, c1 in enumerate(s1): current_row = [i + 1] for j, c2 in enumerate(s2): insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) current_row.append(min(insertions, deletions, substitutions)) previous_row = current_row return previous_row[-1]
#!/usr/bin/env python3 # Находит расстояние Левенштейна для строк; # Версия с циклом def lev(s1, s2): m, n = len(s1), len(s2) if m == 0: return n if n == 0: return m mtx = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): mtx[i][0] = i for j in range(1, n + 1): mtx[0][j] = j for j in range(1, n + 1): for i in range(1, m + 1): if s1[i - 1] == s2[j - 1]: mtx[i][j] = mtx[i - 1][j - 1] else: mtx[i][j] = min(mtx[i - 1][j] + 1, mtx[i][j - 1] + 1, mtx[i - 1][j - 1] + 1) return mtx[m][n] def main(): print(lev('abc', 'abcdef')) if __name__ == '__main__': main()
Отредактировано py.user.next (Март 30, 2016 02:24:27)
Офлайн