koparka Opublikowano 26 Listopada 2005 Zgłoś Opublikowano 26 Listopada 2005 (edytowane) Ostatnio troche bawilem sie z obliczaniem szybkosci algorytmow sortujacych. Maksymalna tablica typu integer jaka udalo mi sie stworzych to 0..7900. Potrzebowalem troche wiecej wiec siegnalem po wskazniki. Sporobowalem na poczatku tak jak gdzies bylo napisane czyli tablica:array[1..7900] of ^integer;ale tutaj dziwnie sie zlozylo ze jescze mniej moglem wpakowac; po kilku dniach wpadlem na inny pomysl: type pomoc=array[0..32000] of integer; dane=^pomoc;var tablica:dane; Nastepnie w glownej czesci programu na samym poczatku robie new(tablica); Czy to jest dobre zastosowanie, poprawne itp...? Nastepnie zdzila mnie jedna rzecz: kiedy zdeklarowalem procedure procedure sortowanko(abc:dane;i2:integer);begin new(abc); {tutaj dzialanie na tej tablicy abc} dispose(abc);end;to nie dzialala poprawnie... postanowailem wiec wywalic new(abc) i potem dispose(abc) i dzialalo pieknie; czy tego nie doczytalem gdzies, czy to jest jakies dziwne zjawisko i wcale nie dziala poprawnie to? ===================================================== I jescze druga sprawa: mam zbadac liczbe porownan i zamian sortowan przez wstawianie i wybor; czy tu dobrze jest to zrobione, bo cos mi sie wyniki nie zgadzaja ze wzorami procedure wstawianie(tb:dane;i2:integer);var pm:integer; a:word;begin czaswstaw:=czas; for a:=2 to i2 do begin tb^[0]:=tb^[a]; pm:=a; porwstaw:=porwstaw+1; while tb^[pm-1]>tb^[0] do begin tb^[pm]:=tb^[pm-1]; dec(pm); porwstaw:=porwstaw+1; end; tb^[pm]:=tb^[0]; zamwstaw:=zamwstaw+1; end; czaswstaw:=czas-czaswstaw;end;procedure wybor(tb:dane;i2:integer);var i,j,k,tmp:integer;begin czaswybor:=czas; for i:=1 to i2-1 do begin k:=i; for j:=i+1 to i2 do begin porwybor:=porwybor+1; if tb^[k]>tb^[j] then k:=j; end; tmp:=tb^[i]; tb^[i]:=tb^[k]; tb^[k]:=tmp; zamwybor:=zamwybor+1; end; czaswybor:=czas-czaswybor;end; Edytowane 26 Listopada 2005 przez koparka Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Sam Sung Opublikowano 26 Listopada 2005 Zgłoś Opublikowano 26 Listopada 2005 Maksymalna tablica typu integer jaka udalo mi sie stworzych to 0..7900. Potrzebowalem troche wiecej wiec siegnalem po wskazniki. Sporobowalem na poczatku tak jak gdzies bylo napisane czyli tablica:array[1..7900] of ^integer;ale tutaj dziwnie sie zlozylo ze jescze mniej moglem wpakowac; Nic dziwnego, zrobiłeś tablicę wskaźników do Integer; w Turbo Pascalu każdy wskaźnik zajmuje 4 bajty, a Integer - 2. po kilku dniach wpadlem na inny pomysl: type pomoc=array[0..32000] of integer; dane=^pomoc;var tablica:dane; Nastepnie w glownej czesci programu na samym poczatku robie new(tablica); Czy to jest dobre zastosowanie, poprawne itp...? Poprawne - o ile oczywiście potrzebujesz tablicy "tablica". (Dalsza część postu świadczy o tym, że chyba nie) Nastepnie zdzila mnie jedna rzecz: kiedy zdeklarowalem procedure procedure sortowanko(abc:dane;i2:integer);begin new(abc); {tutaj dzialanie na tej tablicy abc} dispose(abc);end;to nie dzialala poprawnie... postanowailem wiec wywalic new(abc) i potem dispose(abc) i dzialalo pieknie; czy tego nie doczytalem gdzies, czy to jest jakies dziwne zjawisko i wcale nie dziala poprawnie to? Dziwne. Może akurat brakło pamięci po alokacji wcześniej zmiennej "tablica"? A tak w ogóle, to nie wiem, po co przekazujesz parametr abc do procedury. To powinna być tutaj zmienna lokalna. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
koparka Opublikowano 26 Listopada 2005 Zgłoś Opublikowano 26 Listopada 2005 chodzi o to ze porownuje ze soba algorytmy sortujace dla takich samych danych wprowadzonych - zeby bylo widac ze np dla konkretnej tablicy ktoras metoda jest wolniejsza od innej, Poprawne - o ile oczywiście potrzebujesz tablicy "tablica". (Dalsza część postu świadczy o tym, że chyba nie)musze miec glowna globalna tablice (tablica) zeby wpierw wprowdzic do niej dane do posrotwania i zeby kazda pozniejsza procedura korzytsala z tej tablicy A tak w ogóle, to nie wiem, po co przekazujesz parametr abc do procedury. To powinna być tutaj zmienna lokalna.jak mam procedury sortujace to wywoluje je nastepujaco, np. bubblesort(tablica,zakres); a jest ona zdeklarowana procedure bubblesort(abc:dane,i2:integer); wiec abc jest zmienna lokalna (tylko na czas sortowania), ktora dostaje wlasnie wartosci "tablicy", zeby nie zmienic wartosci "tablica", bo do innego sortowania musza byc takie same dane (tak wiec operacje odbywaja sie tylko na abc); troche nieskladnie napisane, ale chyba rozumiesz o co chodzi :) Dziwne. Może akurat brakło pamięci po alokacji wcześniej zmiennej "tablica"?nie za bardzo rozumiem to zdanie... ale czy jakis brak pamieci moze spowodowac to ze moge dizalac na zmiennej wskazywanej nie dkelarujac jej "new"? a moze jak w procdurze jej zdeklarowany lokalnie wskaznik to automtycznie sie zalacza na czas jej dzialania? W ogole, to dzieki za zainteresowanie tematem i odpowiedz :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Sam Sung Opublikowano 26 Listopada 2005 Zgłoś Opublikowano 26 Listopada 2005 jak mam procedury sortujace to wywoluje je nastepujaco, np. bubblesort(tablica,zakres); a jest ona zdeklarowana procedure bubblesort(abc:dane,i2:integer); wiec abc jest zmienna lokalna (tylko na czas sortowania), ktora dostaje wlasnie wartosci "tablicy", zeby nie zmienic wartosci "tablica", bo do innego sortowania musza byc takie same dane (tak wiec operacje odbywaja sie tylko na abc); troche nieskladnie napisane, ale chyba rozumiesz o co chodzi :) Skoro tak, to nie powinieneś wewnątrz procedury alokować nowej tablicy (a właśnie to robi procedura New). Poprzednio mnie to zmyliło, teraz widzę o co chodzi ;) po prostu tam nie ma być ani New ani Dispose (tak jak zrobiłeś). Wystarczą 2 tablice alokowane raz na cały czas działania programu. A pomiar czasu wygląda na dobry. Można wiedzieć, z jakimi wzorami wyniki się nie zgadzają? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
koparka Opublikowano 26 Listopada 2005 Zgłoś Opublikowano 26 Listopada 2005 (edytowane) nie chodzi mi o pomiar czasu - bo to chyba jest ok, ale bardziej o pomiar ilosci zmaian i porownan w poszczegolnych sortowniach: np jak we wstawianiu jest jakies poronanie to zmienna porwstaw zostaje powieszkona o 1 i tak samo z zamina zmienna zamwstaw jest powiekszana, wzorki to http://www.twobeds.com/upload/userfiles/kuba222/sorty.txtPO to porwnania, a P to przestawienia-zamiany Skoro tak, to nie powinieneś wewnątrz procedury alokować nowej tablicy (a właśnie to robi procedura New).Czyli ze juz automtycznie sie zalacza wskaznik wewnatrz procedury i moge dizalac na niej bez new? A co dokladnie znaczy alokowac, bo tego slowka za bardzo nie kumam :] By google: Alokować - zarezerwować ilość pamięci wystarczającą na potrzeby operacji wykonywanych przez program. Czy o takie znaczenie chodzi? Edytowane 26 Listopada 2005 przez koparka Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...