wyszukiwanie w ciągu

0

witam
mam 2 pliki tekstowe. ich zawartość przechowują 2 zmienne "plik1" i "plik2" i teraz chce zrobić takie porównanie: czy w "plik2" powtarzają się jakieś słowa z "plik1"

i teraz pytanie :D :
jak sposób będzie "najefektywniejszy" ?

myslałem aby <ort>uŻyć</ort> Split() i jak bede mial już to podzielone w tablicy to wtedy porównać zawartość komórek i po zawodach, ale co jeśli plik bedzie dość ort! np. 2MB textu ?

przejście znak po znaku ciągu to najgorszy chyba sposób

patrzylem też na metode Compare ale niewiem czy zda sie w tym przykladzie ?

Z góry Wielkie dzieki za pomoc, podpowiedzi :)

//omg.. że tak się wtrącę - najgorszy ort ['duży'] jakiego widziałem chyba 8-| - M

0

Jezeli chcesz tylko sprawdzic, czy slowa z pierwszego istnieja w drugim, to tworzysz tablice haszujaca, wczytujesz do niej slowa z drugiego (gdzie slowo to klucz oczywiscie) a nastepnie wczytujac kolejno slowa z pierwszego sprawdzasz czy taki klucz istnieje. Przede wszystkim:

  1. Nie wczytujesz zawartosci plikow do pamieci, wiec moga byc wielkie.
  2. Wyszukiwanie w tablicy haszujacej ma zlozonosc praktycznie jednostkowa.

Powinno byc wiec szybkie. Jesli chcesz optymalnie ustawic wielkosc tablicy haszujacej, to powinna byc ok. 2 razy wieksza od ilosci elementow, czyli slow. W jez. angielskim przecietna dlugosc slowa to ok. 5 znakow, wiec mozesz przyjac, ze przyblizona ilosc slow w pliku to dlugosc/5.

pozdrawiam
johny

0

no ok
nigdy nie korzystalem z Hashtable

i jak bym miał coś takiego:

Hashtable tablica = new Hashtable();
tablica.Add("slowo2", "slowo1");

to i tak żeby wyodrębnić słowa z ciągu aby powstawiać je w nastepne komórki muszę uzyć albo petli co mi to podzieli albo Split(' ')

no chyba że czegośtu nie rozumiem
POZDRO

0
cieniu napisał(a)

no ok
nigdy nie korzystalem z Hashtable

i jak bym miał coś takiego:

Hashtable tablica = new Hashtable();
tablica.Add("slowo2", "slowo1");

to i tak żeby wyodrębnić słowa z ciągu aby powstawiać je w nastepne komórki muszę uzyć albo petli co mi to podzieli albo Split(' ')

no chyba że czegośtu nie rozumiem
POZDRO

Po pierwsze wystarczy, ze dodajesz wartosci do tablicy jako klucze, nie na zasadzie klucz - wartosc. To wystarczy, bo chcesz tylko wiedziec, czy dane slowo w tablicy wystepuje czy nie. Chyba, ze chcialbys zliczac ilosc slow, czy cos podobnego.

Po drugie - owszem, musisz wyodrebnic slowa z ciagu, ale nie musisz wczytywac calego pliku do tego. Mozesz wczytywac po linii (jesli wiesz, ze plik nie jest w jednej linii) albo wczytuj kawalkami do bufora. Np. 5000 znakow na raz, przegladasz, w przypadku ostatniego slowa dolaczasz go na poczatku kolejnego ciagu (gdyby akurat sie slowo na czesci podzielilo). W ten sposob w trakcie czytania przegladasz slowa, a nie najpierw ladujesz plik, a pozniej przegladasz. Mozesz of coz uzywac splita, albo jakiejs wlasnej funkcji.

pozdrawiam
johny

0

zliczać to może nie
konkretnie chodziło o to aby po wczytaniu 2 plików porównać ich zawartość. I np. w richtextbox2 by mi zaznaczył te kawalki które są już w pierwszym pliku

0
cieniu napisał(a)

zliczać to może nie
konkretnie chodziło o to aby po wczytaniu 2 plików porównać ich zawartość. I np. w richtextbox2 by mi zaznaczył te kawalki które są już w pierwszym pliku

Hmm... Myslalem, ze chodzi o wystepowanie slow, a nie ciagu jednego tekstu. W takim wypadku mozesz po prostu wczytywac kawalki obydwu plikow i porownywac znaki o tych samych indeksach. Wtedy mialbys porownywanie po prostu identycznosci plikow, a nie fragmentow wystepujacych w nich.
Jesli bys chcial wynajdywac fragmenty identyczne, ale bedace w innym miejscu w jednym pliku, a w innym w drugim to musze pomyslec :P

Po drugie, jesli chcialbys pokazywac pliki i rozniace sie fragmenty, no to musisz wczytywac zawartosc po prostu(odpada przy duzych plikach) albo stronicujac (bardziej skomplikowane).

pozdrawiam
johny

0

powinienem chyba napisać Od razu dokladnie co ma program robić :/ sorka za niedoinformowanie :(

2 pliki ich zawartość podobna ale wymieszana.
np. dwa pliki zawierające jakaś konfiguracje np:(zmienna = "3") kawałki się powtarzają w drugim pliku ale są w zupelnie innym miejscu np. gdzieś na końcu. I chodzilo by o to w programie aby porównal te dwa pliki i zaznaczył to co się powtzrza aby w pliku(konfigu) nie bylo dwa razy tego samego. Czyli polącz oba pliki ale bez powtórzeń :)

0
cieniu napisał(a)

powinienem chyba napisać Od razu dokladnie co ma program robić :/ sorka za niedoinformowanie :(

2 pliki ich zawartość podobna ale wymieszana.
np. dwa pliki zawierające jakaś konfiguracje np:(zmienna = "3") kawałki się powtarzają w drugim pliku ale są w zupelnie innym miejscu np. gdzieś na końcu. I chodzilo by o to w programie aby porównal te dwa pliki i zaznaczył to co się powtzrza aby w pliku(konfigu) nie bylo dwa razy tego samego. Czyli polącz oba pliki ale bez powtórzeń :)

To w takim razie mam taki pomysl:
Pierwszy plik ladujesz w tablice haszujaca, gdzie slowo to klucz, indeks w pliku to wartosc tego klucza.
Nastepnie czytasz drugi plik i dla kazdego slowa robisz nastepujace operacje:

  1. sprawdzasz czy takie slowo wystepuje w tablicy haszujacej jako klucz
  2. Jesli nie, to continue.
  3. Jesli tak, to zaznaczasz sobie gdzies, ze to poczatek fragmentu
  4. Sprawdzasz nastepne slowo po tym poczatku i szukasz czy jest w tablicy haszujacej
  5. Jesli nie to koniec fragmentu
  6. Jesli tak to sprawdzasz czy indeks_nastepnego_slowa - indeks_poczatku_fragmentu = dlugosc_aktualnego_fragmentu : czyli czy dwa kolejne slowa tworza rowniez dwa kolejne slowa w pierwszym pliku
  7. Jesli tak, to fragment jest kontynuowany
  8. Jesli nie, to koniec fragmentu

Mysle, ze w miare logiczne i powinny byc tez sensownie szybkie - raz czytasz jeden plik, raz czytasz drugi plik i nie musisz ich wczytywac w calosci.

Oczywiscie musisz brac po uwage wszystkie biale znaki, nie tylko spacje, itd.

Jak natomiast bedziesz wypisywal te fragmenty, to juz proponuje stronicowanie, zebys mogl obslugiwac duze pliki.

pozdrawiam
johny

0

qrde jakoś nie czuje tego Hashtable :/

Pierwszy plik ladujesz w tablice haszujaca, gdzie slowo to klucz, indeks w pliku to wartosc tego klucza.

tablica(index,klucz)

możesz dać kawalek kodu przedstawiający jak zaladować ten plik do tablicy bo chyba czegoś tu mocno nie kumam :/
ja bym dal petle co by przeszla przez cały string i powstawiała wartosci do hashtable ale chyba nie o to Ci chodzi coś tak czuje :-/

Nastepnie czytasz drugi plik i dla kazdego slowa robisz nastepujace operacje

tu też bym dal pętle co by zprawdzala czy mamy słowo jak tak to by patrzyla czy jest w tablicy Ale coś czuje że też nie oto chodzi :/

POZDRO

0

Przyklad kodu napisze wieczorkiem, bo aktualnie jestem dosc zajety.

Z tablicami haszujacymi chodzi krotko mowiac o to, ze bardzo szybko znajduje sie klucz w takiej tablicy - sa idealne np. w przypadku slownika. Klucz to wartosc indeksu (liczbowa w normalnej tablicy), ktora w tym wypadku moze byc tekstem.

pozdrawiam
johny

0

SUPER !!
czekam z niecierpliwością

lukałem na MSDNA ale tam mają przykład co domnie nie trafia :/
no chyba że jakoś dziwnie (inaczej) myślę ;P
POZDRO

0

Witam.

Obiecany przyklad:

Hashtable table = new Hashtable();
StreamReader plik = new StreamReader("plik.txt");
char [] buff = new char[10];
int i=0;
String slowo="";
while (plik.Read(buff, 0, 10)!=0)
{
	foreach(char znak in buff)
	{
		if(znak==' ') {
			try
			{
				table.Add(slowo,i);
			}
			catch(ArgumentException e)
			{}
			slowo="";
			continue;
		}
		slowo+=znak;
	}
	i+=10;
}
IEnumerator en= table.Keys.GetEnumerator();
while(en.MoveNext())
	Console.WriteLine(Convert.ToString(en.Current));
plik.Close();

Mam nadzieje, ze wyjasni troche jak sie poslugiwac tablica haszujaca.

Tobie praktycznie chyba wystarczy metoda ContainsKey i pobieranie konkretnego indeksu slowa (czyli wartosci danego klucza).

Powodzenia :)

pozdrawiam
johny

0

SUPER !!
ale niestety tera ja mam nieplanowane zajęcie :/ i musze odłzyć ten programik :(

ALE OLBRZYMIE DZIEKI
JAK BEDE MIAŁ JESZCZE JAKIEŚ WĄTPLIWOŚCI TO SIĘ ODEZĘ
POZDRAWIAM !!

0
cieniu napisał(a)

SUPER !!
ale niestety tera ja mam nieplanowane zajęcie :/ i musze odłzyć ten programik :(

ALE OLBRZYMIE DZIEKI
JAK BEDE MIAŁ JESZCZE JAKIEŚ WĄTPLIWOŚCI TO SIĘ ODEZĘ
POZDRAWIAM !!

Nie ma sprawy, zagladam pare razy w ciagu dnia.

pozdrawiam
johny

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