Qt, efektywny algorytm szukania różnic w dwóch plikach

0

Piszę małą aplikacyjkę, coś a'la winmerge która ma za zadanie porównać zawartości dwóch plików tekstowych i zobrazować te różnice poprzez zaznaczenie tła wokół danych znaków w obu plikach.
Proszę o przykład takiej implementacji. Próbowałem wstawek htmlowych ale przy plikach które zawierają tagi takie rozwiązanie nie działa. Wyświetla się kod html zamiast kolorować tło. W dodatku przy większych plikach całość wiesza się, mój algorytm jest nieefektywny..

może zamiast wczytywać do zmiennych i później chodzić po pętli porównywać znak z pierwszego stringa z drugim to ładować do strumienia i już na tym poziomie dokonywać porównywania?

1

Jak duże są te pliki?
Jeżeli wieszanie to aż taki problem może rób to w osobnym wątku (algorytm będzie niezmieniony ale główny wątek nie będzie zawieszony przez ten czas).
Ewentualnie podziel pliki na chunki i porównuj te chunki w osobnych wątkach.

0

Pomijając bug że plik drugi może mieć mniejszy rozmiar od pierwszego i będzie błąd aplikacja wyleci, to algorytm wygląda tak

void Lol::run(const QString& contentA, const QString& contentB)
{
    for(int i = 0; i < contentA.length(); ++i)
    {
        if(contentA.at(i) == contentB.at(i))
        {
            resultA.append(contentA.at(i));
            resultB.append(contentB.at(i));
        }
        else if(contentA.at(i) != contentB.at(i))
        {
            resultA.append("<span style=\"color: white; background-color:orange;\">")
                    .append(contentA.at(i))
                    .append("</span>");
            resultB.append("<span style=\"color: white; background-color:orange;\">")
                    .append(contentB.at(i))
                    .append("</span>");
        }
    }
}

:D
Wątki to ostateczność czy da się to jakoś lepiej rozwiązać?
Myślałem o porównywaniu plików zaraz na poziomie strumieni bo tutaj to już są zmienne

2

Szczerze nie wiem.

A tak poza tym to nie uważasz że lepiej byłoby zwracać tablice z indeksem różniących się znaków i markować je w osobnej funkcji?
(Nie znam się, tylko taka sugestia :))

EDIT: Jeżeli chodzi o te ify to czy tam w drugim warunku nie wystarczy samo else?

1

Nie ma w Qt RichEdita? Albo wrapera na kontrolkę scintilla ? Pięknie można użyć do kolorowania
Przechodzenie przez HTML odbieram jako straszne ...

Zgadzam się z @Yukiteru Gromadzki że oddzielenie algorytmiki od kolorowania by było bdb.

0

Czy zamiast if-ów możesz dać dwie pętle while ?

2
Yukiteru Gromadzki napisał(a):

Szczerze nie wiem.

A tak poza tym to nie uważasz że lepiej byłoby zwracać tablice z indeksem różniących się znaków i markować je w osobnej funkcji?
(Nie znam się, tylko taka sugestia :))

Wracając do tematu, czyli "... efektywny algorytm szukania różnic w dwóch plikach" nie wiem jaka jest natura różnic w Twoich @AfrykanskiPomorSwin plikach.
Pewien jesteś, że zmianą (różnicą) nie może być nowa/skasowana linia ?
Porównywanie dokładnie tej samej pozycji znaku może być nieprawidłowe - ale może być prawidłowe, to Ty wiesz.

UPDATE: Oprócz tego temat jest niejasny. Qt nie ma nic do algorytmiki tego zagadnienia, ale ma do prezentacji.
I dylemat, o co jest pytanie: algorytmikę czy prezentację? Dobrze postawione pytanie to pół rozwiązania

3

Użyj wyjścia polecenia diff.
Albo fc pod Windowsem.
Albo diff pod Windowsem, dołączając odpowiednie binarki do swojej aplikacji...

https://www.geeksforgeeks.org/diff-command-linux-examples/

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fc

http://gnuwin32.sourceforge.net/

Na podstawie otrzymanych danych, możesz pokazać różnice w jakimś tekstowym polu Qt.

Twój program to będzie taka nakładka graficzna na diff/fc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1