Търсене и съвпадение различен подниз на два реда, подадени до общата дължина. Резултати - таблични стойности №№ началото и края на еднакви и различни фрагменти. Дихотомна байпас, висока скорост.
Отне ми 2 линии за сравнение и определи кои части от тях са едни и същи, и които са различни. За удобство е довело до дължина низ. Въпреки това е възможно нарязан надолу, така че да се сравняват двете със същата дължина, ако е необходимо, всякакви два реда. Е, нищо, но трудни регулярни изрази така символ-мъдър изброяване не е намерен. RegExp pripahali не успя да издаде резултати в правото ми (може би си ръка крива) и един знак образуват да заобиколят дългите линии не искат да. В резултат на това аз направих това, може би това е полезно.
функция PoluchitRazlichiyaDvuhStrok (баджове stro1 означава stro2. Tf = Неопределен означава rDelta = 0)
Ако TF = Неопределен Тогава
// това е първата итерация, инициализира
// резултати в таблицата за възстановяване стойност определяне фрагменти: № nachsim, № Kons, EstRaznitsa (булеви)
TF = нов TablitsaZnacheny;
TF. Колона. Добави ( "Старт");
TF. Колона. Добави ( "The End");
TF. Колона. Добави ( "EstRaznitsa");
Ако stro1 = stro2 Тогава // никаква разлика
strotf = TF. Добави ();
strotf. Започнете = 1;
strotf. Край = StrDlina (stro2);
rDlina1 = StrDlina (stro1);
rDlina2 = StrDlina (stro2);
Ако rDlina1 <> Тогава rDlina2 // могат да се режат на същата дължина, както и да се откаже
rMinDlina = Min (rDlina1 rDlina2.);
rMaksDlina = Max (rDlina1 rDlina2.);
Ако rMinDlina = rDlina1 Тогава stro2 = Лъв (stro2 rMinDlina.) ENDIF;
Ако rMinDlina = rDlina2 Тогава stro1 = Лъв (stro1 rMinDlina.) ENDIF;
PoluchitRazlichiyaDvuhStrok (stro1 stro2 TF ..);
// doobrabotaem разлика дължини, ако беше от написването на "опашка" от по-дългия низ
Ако rMaksDlina <> 0 След
strotf = TF. Добави ();
strotf. Като се започне rMinDlina = + 1;
strotf. Край = rMaksDlina;
strotf. EstRaznitsa = True; // априори
// това ще обърнем груб (тази маса никога няма да бъде много голяма, така че не може да се отличи)
TF2 = TF. SkopirovatKolonki (); starER = Неопределен; starNachalo = 0; starKonets = 0;
За всеки цикъл strotf От TF
Ако starER <> strotf. Тогава EstRaznitsa
Ако starER <>Тогава // неопределен приключи предишната
strotf2 = TF2. Добави ();
strotf2. Започнете = starNachalo;
strotf2. Край = starKonets;
strotf2. EstRaznitsa = starER;
starER = strotf. EstRaznitsa;
starNachalo = strotf. Започнете;
starKonets = strotf. Край;
Ако starER <>Тогава // неопределен приключи предишната
strotf2 = TF2. Добави ();
strotf2. Започнете = starNachalo;
strotf2. Край = starKonets;
strotf2. EstRaznitsa = starER;
// рекурсивен подходящо сравнение низ
etstro = stro1; // линия стандарт
obrstro = stro2; // Обработете низ
Китка = Int (StrDlina (obrstro) / 2);
Ако Поузи = 0 След това се върнете "" ENDIF; // ненормално положение
kuset1 = Leo (etstro Китка.);
kuset2 = Ср (etstro Китка + 1);
kusobr1 = Leo (obrstro Китка.);
kusobr2 = Ср (obrstro Китка + 1);
izm1 = (kuset1 <> kusobr1);
izm2 = (kuset2 <> kusobr2);
// гледам първо парче
Ако не, то izm1
strotf = TF. Добави ();
strotf. Започнете = (= 0. 1. rDelta rDelta);
strotf. Край = strotf. Като се започне + StrDlina (kusobr1) - 1;
strotf. EstRaznitsa = False;
// В противен случай, тази част е различна, отиде по-далеч от това лечение, както на отделен ред
rNachalo = (= 0. 1. rDelta rDelta);
= + RKonets rNachalo StrDlina (kusobr1) - 1;
Ако rNachalo = rKonets // След това крайната фаза, символът за разлика 1
strotf = TF. Добави ();
strotf. Започнете = rNachalo;
strotf. Край = rKonets;
strotf. EstRaznitsa = True;
PoluchitRazlichiyaDvuhStrok (kuset1 kusobr1 TF rDelta ...);
// Виж второто парче
rDelta = (Поузи + 1) + rDelta - (rDelta = 0. 0. 1) ?;
Ако не, то izm2
strotf = TF. Добави ();
strotf. Започнете = rDelta;
strotf. Край = strotf. Като се започне + StrDlina (kusobr2) - 1;
strotf. EstRaznitsa = False;
// В противен случай, тази част е различна, отиде по-далеч от това лечение, както на отделен ред
= + RKonets rNachalo StrDlina (kusobr2) - 1;
Ако rNachalo = rKonets // След това крайната фаза, символът за разлика 1
strotf = TF. Добави ();
strotf. Започнете = rNachalo;
strotf. Край = rKonets;
strotf. EstRaznitsa = True;
PoluchitRazlichiyaDvuhStrok (kuset2 kusobr2 TF rDelta ...);
// връща нищо, резултатът не е важен
Свързани статии