Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include<cstdlib>
  5. using namespace std;
  6.  
  7.  
  8. int tab [1000000];
  9. int tabx [1000000];
  10. int tabpom [1000002]={0};
  11. int gi=0;
  12. //nieparzyste X
  13. void randGenX (int n, int maks)
  14. {
  15. for (int i=0;i<1000002; i++)
  16. {
  17. tabpom[i]=0;
  18. }
  19. int x;
  20. srand(time(NULL));
  21. for (int i=0; i<n; i++)
  22. {
  23. x= rand()%maks +1;
  24. while (tabpom [x]!=0 || x%2==0) //jesli jeden z tych warunkow nie jest spelniony-zdanie jest prawda-nastepuje ponowne losowanie-jesli oba sa prawda-nie losuje
  25. {
  26. x= rand()%maks +1;
  27. }
  28.  
  29. tabx[i] = x; //poprawka - przypisanie było odwrotnie
  30. tabpom [x] ++; //zwiekszanie licznika wystapien danej liczby
  31.  
  32. }
  33.  
  34. }
  35.  
  36. void ascGen (int n)
  37. {
  38. for (int i=0; i<n; i++)
  39. {
  40. tab[i]=(i+1)*2;
  41. }
  42. }
  43.  
  44. //int tabpom [1000002]={0};
  45. void randGen (int n)
  46. {
  47. for (int i = 0; i < 1000002; i++) {
  48. tabpom[i] = 0;
  49. }
  50. int x;
  51. srand(time(NULL));
  52. for (int i=0; i<n; i++)
  53. {
  54. x= rand()%1000000 +1;
  55. while (tabpom [x]!=0 || x%2!=0)
  56. {
  57. x= rand()%1000000 +1;
  58. }
  59.  
  60. tab[i] = x; //poprawka - odwrotne przypisanie
  61. tabpom [x] ++;
  62.  
  63. }
  64.  
  65. }
  66. int tabpomm[1000000]; //tablica globalna
  67. //polowienie binarne
  68. void BinDiv(int left, int right)
  69. {
  70. if (left<=right)
  71. {
  72. int pivot = (left+right)/2;
  73. tabpomm[gi]=tab[pivot];
  74. gi++;
  75. BinDiv(left, pivot-1); //lewy podprzedzial
  76. BinDiv(pivot+1, right); //prawy
  77. }
  78. }
  79.  
  80. //funkcja przekopiowuje wynik pracy BinDiv z tablicy tabpomm do tab
  81. void BinDivCopy(int n)
  82. {
  83. for (int i = 0; i < n; i++) {
  84. tab[i] = tabpomm[i];
  85. }
  86. }
  87.  
  88.  
  89. struct Lnode
  90. {
  91. Lnode *prev;
  92. Lnode *next;
  93. int n;
  94. };
  95.  
  96.  
  97. struct Tnode
  98. {
  99. int n;
  100. Tnode *left;
  101. Tnode *right;
  102. Tnode *up;
  103. };
  104. Tnode *root;
  105.  
  106.  
  107.  
  108. void addElement(Tnode *root, int n)
  109. {
  110. Tnode *current = root;
  111. while (true)
  112. {
  113. if (n > current->n)
  114. {
  115. if (current->right == NULL)
  116. {
  117. Tnode *newnode = new Tnode;
  118. newnode->n = n;
  119. newnode->right = NULL;
  120. newnode->left = NULL;
  121. newnode->up=current; //tutaj byl problem
  122. current->right = newnode;
  123. break;
  124. }
  125. else
  126. {
  127. current = current->right;
  128. }
  129. }
  130. else
  131. {
  132. if (current->left == NULL)
  133. {
  134. Tnode *newnode = new Tnode;
  135. newnode->n = n;
  136. newnode->right = NULL;
  137. newnode->left = NULL;
  138. newnode->up=current;//i tutaj tez
  139. current->left = newnode;
  140. break;
  141. }
  142. else
  143. {
  144. current = current->left;
  145. }
  146. }
  147. }
  148. }
  149.  
  150.  
  151. void findElement(Tnode *root, int n)
  152. {
  153. Tnode *current = root;
  154. while (current->n != n)
  155. {
  156. if (n > current->n)
  157. {
  158. current = current -> right;
  159. }
  160. else
  161. {
  162. current = current -> left;
  163. }
  164. }
  165. }
  166.  
  167.  
  168.  
  169. // Funkcja zwraca wskaznik do elementu najbardziej na lewo, na bazie eduinf.waw.pl
  170. //Ich implementacja jest trochę klarowniejsza, uznałem że łatwiej będzie można ją wykorzystac
  171. Tnode * FindMin(Tnode * p)
  172. {
  173. if(p != NULL)
  174. while(p->left != NULL) p = p->left;
  175. return p;
  176. }
  177.  
  178. // Funkcja znajduje następnik węzła p, na bazie eduinf.waw.pl
  179. Tnode * FindSuccesor(Tnode * p)
  180. {
  181. Tnode * r;
  182.  
  183. if(p != NULL)
  184. {
  185. if(p->right != NULL) return FindMin(p->right);
  186. else
  187. {
  188. r = p->up;
  189. while(r != NULL && (p == r->right))
  190. {
  191. p = r;
  192. r = r->up;
  193. }
  194. return r;
  195. }
  196. }
  197. return p;
  198. }
  199.  
  200. // Procedura usuwa węzeł drzewa, na bazie eduinf.waw.pl
  201. void DeleteElement(Tnode * & root, Tnode * X)
  202. {
  203. Tnode * Y, * Z;
  204.  
  205. if(X != NULL)
  206. {
  207. // Jeśli X nie ma synów lub ma tylko jednego, to Y wskazuje X
  208. // Inaczej Y wskazuje następnik X
  209.  
  210. if (X->left == NULL || X->right == NULL) {
  211. Y = X;
  212. }
  213. else
  214. {
  215. Y = FindSuccesor(X);
  216. }
  217.  
  218. // Z wskazuje syna Y lub NULL
  219.  
  220. if (Y->left != NULL) {
  221. Z = Y->left;
  222. }
  223. else
  224. {
  225. Z = Y->right;
  226. }
  227.  
  228. // Jeśli syn Y istnieje, to zastąpi Y w drzewie
  229.  
  230. if(Z != NULL) Z->up = Y->up;
  231.  
  232. // Y zostaje zastąpione przez Z w drzewie
  233.  
  234. if (Y->up == NULL) root = Z;
  235. else if(Y == Y->up->left) Y->up->left = Z;
  236. else Y->up->right = Z;
  237.  
  238. // Jeśli Y jest następnikiem X, to kopiujemy dane
  239.  
  240. if(Y != X) X->n = Y->n;
  241.  
  242. delete Y;
  243.  
  244. }
  245. }
  246.  
  247.  
  248. void DeleteElementByValue (Tnode *root, int n) {
  249. Tnode *current = root;
  250. while (current->n != n)
  251. {
  252. if (n > current->n)
  253. {
  254. current = current -> right;
  255. }
  256. else
  257. {
  258. current = current -> left;
  259. }
  260. }
  261. DeleteElement(root, current);
  262. }
  263.  
  264. //usuwa drzewo dla danego korzenia
  265. void DeleteTree (Tnode *start) {
  266. if (start != NULL) {
  267. DeleteTree(start->left);
  268. DeleteTree(start->right);
  269. delete start;
  270. }
  271. }
  272.  
  273. //zwraca wysokosc drzewa, h = 0 przy wywolaniu
  274. int getHeight (Tnode *x, int h) {
  275. if (x == NULL) {return h;}
  276. int a = getHeight(x->left, h+1);
  277. int b = getHeight(x->right, h+1);
  278. if (a>b) {
  279. return a;
  280. } return b;
  281. }
  282.  
  283. //...........OBSLUGA LISTY....................
  284.  
  285. void AddListElement (Lnode *start, int n)
  286. {
  287. Lnode *p;
  288. p=start;
  289. while (n<p->n)
  290. {
  291. p=p->next;
  292. }
  293.  
  294. Lnode *mid=new Lnode;
  295. mid->n=n;
  296. Lnode *prawy=p;
  297. Lnode *lewy=p->prev;
  298. mid->prev=lewy;
  299. mid->next=prawy;
  300. lewy->next=mid;
  301. prawy->prev=mid;
  302.  
  303. }
  304.  
  305. //symulacja czasu znalezienia elementu
  306. void FindListElement (Lnode *start, int n)
  307. {
  308. while (start-> n != n) {
  309. start = start -> next;
  310. }
  311. }
  312.  
  313. void RemoveListElement (Lnode *start, int n)
  314. {
  315. Lnode *p;
  316. p=start;
  317. while (p->n!=n)
  318. {
  319. p=p->next;
  320. }
  321. Lnode *todelete;
  322. todelete=p;
  323. Lnode *poprzedni;
  324. Lnode *nastepny;
  325. poprzedni=p->prev;
  326. nastepny=p->next;
  327.  
  328. delete todelete;
  329. poprzedni->next=nastepny;
  330. nastepny->prev=poprzedni;
  331. }
  332.  
  333. int main()
  334. {
  335. int n,x;
  336. clock_t t_start, t_stop; //zmiana nazw - potencjalna kolizja z start i stop listy
  337. double czas;
  338. int input;
  339. Lnode *start, *stop, *newlist;
  340. for (n=50000; n<550000; n=n+25000) {
  341. //cout<<"n: "<<n<<endl;
  342. x=n/100;
  343. //zestaw dla polowienia binarnego:
  344. gi = 0;
  345. ascGen(n); //Najpierw generujemy ciag rosnacy - na nim bedzie operowal BinDiv
  346. BinDiv(0, n-1); //Odpalamy BinDiv, dane zostaja zapisane w tabpomm
  347. BinDivCopy(n); //Kopiujemy dane z tabpomm do tab
  348.  
  349. /*
  350. //zestaw dla rosnacego:
  351. //*///ascGen(n);
  352.  
  353. //zestaw dla losowego:
  354. //randGen(n);
  355.  
  356. randGenX(x,2*n); //Generujemy ciag x - w kazdym przypadku
  357. czas=0;
  358. t_start = clock(); //czas start tworzenia nowej listy
  359. //tworzenie nowej listy
  360. newlist=new Lnode;
  361. newlist->n=tab[0];
  362. newlist->prev = NULL; //konieczne przy tworzeniu listy
  363. newlist->next = NULL;
  364. start=newlist;
  365. stop=newlist;
  366. //wywolanie dla listy malejacej dodawania nowego elementu
  367.  
  368. for (int i = 1; i < n; i++) { //i trzeba było zadeklarować przez int i
  369. input = tab[i]; //to potrzebne w za każdym razem - zawsze wstawiamy inny element
  370. if (start->n <= input)
  371. { //jezeli element trzeba wstawic na poczatek listy
  372. Lnode *newnode=new Lnode;
  373. newnode->n = input;
  374. newnode->prev = NULL;
  375. newnode -> next = start;
  376. start->prev=newnode;
  377. start=newnode;
  378. }
  379. else if (stop->n >=input)
  380. { //jezeli element trzeba wstawic na koniec listy
  381. FindListElement(start, stop->n); //symulacja czasu znalezienia ostatniego elementu
  382. Lnode *newnode=new Lnode;
  383. newnode->n=input;
  384. newnode->prev=stop;
  385. newnode->next=NULL;
  386. stop->next=newnode;
  387. stop=newnode;
  388. }
  389. else
  390. { //jezeli element trzeba wstawic miedzy istniejace
  391. AddListElement (start, input);
  392. }
  393. }
  394. t_stop=clock();
  395. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  396. cout<<czas<<endl;
  397. czas=0;
  398. }
  399. cout<<endl;
  400.  
  401. for (n=50000; n<550000; n=n+25000) {
  402. //cout<<"n: "<<n<<endl;
  403. x=n/100;
  404. //zestaw dla polowienia binarnego:
  405. gi = 0;
  406. ascGen(n); //Najpierw generujemy ciag rosnacy - na nim bedzie operowal BinDiv
  407. BinDiv(0, n-1); //Odpalamy BinDiv, dane zostaja zapisane w tabpomm
  408. BinDivCopy(n); //Kopiujemy dane z tabpomm do tab
  409.  
  410. /*
  411. //zestaw dla rosnacego:
  412. //*/ //ascGen(n);
  413.  
  414. //zestaw dla losowego:
  415. //randGen(n);
  416.  
  417. randGenX(x,2*n); //Generujemy ciag x - w kazdym przypadku
  418.  
  419. //tworzenie nowej listy
  420. newlist=new Lnode;
  421. newlist->n=tab[0];
  422. newlist->prev = NULL; //konieczne przy tworzeniu listy
  423. newlist->next = NULL;
  424. start=newlist;
  425. stop=newlist;
  426. //wywolanie dla listy malejacej dodawania nowego elementu
  427.  
  428. for (int i = 1; i < n; i++) { //i trzeba było zadeklarować przez int i
  429. input = tab[i]; //to potrzebne w za każdym razem - zawsze wstawiamy inny element
  430. if (start->n <= input)
  431. { //jezeli element trzeba wstawic na poczatek listy
  432. Lnode *newnode=new Lnode;
  433. newnode->n = input;
  434. newnode->prev = NULL;
  435. newnode -> next = start;
  436. start->prev=newnode;
  437. start=newnode;
  438. }
  439. else if (stop->n >=input)
  440. { //jezeli element trzeba wstawic na koniec listy
  441. FindListElement(start, stop->n); //symulacja czasu znalezienia ostatniego elementu
  442. Lnode *newnode=new Lnode;
  443. newnode->n=input;
  444. newnode->prev=stop;
  445. newnode->next=NULL;
  446. stop->next=newnode;
  447. stop=newnode;
  448. }
  449. else
  450. { //jezeli element trzeba wstawic miedzy istniejace
  451. AddListElement (start, input);
  452. }
  453. }
  454.  
  455.  
  456.  
  457. //dane już zostały wstawione do listy, teraz dodajemy ciąg x do listy
  458. //cout<<"dodawanie ciagu x"<<endl;
  459. t_start=clock();
  460. for (int i = 0; i < x; i++) {
  461. input = tabx[i];
  462. if (start->n <= input)
  463. { //jezeli element trzeba wstawic na poczatek listy
  464. Lnode *newnode=new Lnode;
  465. newnode->n = input;
  466. newnode->prev = NULL;
  467. newnode -> next = start;
  468. start->prev=newnode;
  469. start=newnode;
  470. }
  471. else if (stop->n >=input)
  472. { //jezeli element trzeba wstawic na koniec listy
  473. Lnode *newnode=new Lnode;
  474. newnode->n=input;
  475. newnode->prev=stop;
  476. newnode->next=NULL;
  477. stop->next=newnode;
  478. stop=newnode;
  479. }
  480. else
  481. { //jezeli element trzeba wstawic miedzy istniejace
  482. AddListElement (start, input);
  483. }
  484. }
  485. t_stop=clock();
  486. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  487. cout<<czas<<endl;
  488. czas=0;
  489. }
  490. cout<<endl;
  491.  
  492. //następnie usuwamy ciąg x z listy
  493. for (n=50000; n<550000; n=n+25000) {
  494. //cout<<"n: "<<n<<endl;
  495. x=n/100;
  496. //zestaw dla polowienia binarnego:
  497. gi = 0;
  498. ascGen(n); //Najpierw generujemy ciag rosnacy - na nim bedzie operowal BinDiv
  499. BinDiv(0, n-1); //Odpalamy BinDiv, dane zostaja zapisane w tabpomm
  500. BinDivCopy(n); //Kopiujemy dane z tabpomm do tab
  501.  
  502. /*
  503. //zestaw dla rosnacego:
  504. //*/ //ascGen(n);
  505.  
  506. //zestaw dla losowego:
  507. //randGen(n);
  508.  
  509. randGenX(x,2*n); //Generujemy ciag x - w kazdym przypadku
  510.  
  511. //tworzenie nowej listy
  512. newlist=new Lnode;
  513. newlist->n=tab[0];
  514. newlist->prev = NULL; //konieczne przy tworzeniu listy
  515. newlist->next = NULL;
  516. start=newlist;
  517. stop=newlist;
  518. //wywolanie dla listy malejacej dodawania nowego elementu
  519.  
  520. for (int i = 1; i < n; i++) { //i trzeba było zadeklarować przez int i
  521. input = tab[i]; //to potrzebne w za każdym razem - zawsze wstawiamy inny element
  522. if (start->n <= input)
  523. { //jezeli element trzeba wstawic na poczatek listy
  524. Lnode *newnode=new Lnode;
  525. newnode->n = input;
  526. newnode->prev = NULL;
  527. newnode -> next = start;
  528. start->prev=newnode;
  529. start=newnode;
  530. }
  531. else if (stop->n >=input)
  532. { //jezeli element trzeba wstawic na koniec listy
  533. FindListElement(start, stop->n); //symulacja czasu znalezienia ostatniego elementu
  534. Lnode *newnode=new Lnode;
  535. newnode->n=input;
  536. newnode->prev=stop;
  537. newnode->next=NULL;
  538. stop->next=newnode;
  539. stop=newnode;
  540. }
  541. else
  542. { //jezeli element trzeba wstawic miedzy istniejace
  543. AddListElement (start, input);
  544. }
  545. }
  546.  
  547.  
  548.  
  549. //dane już zostały wstawione do listy, teraz dodajemy ciąg x do listy
  550. //cout<<"dodawanie ciagu x"<<endl;
  551. t_start=clock();
  552. for (int i = 0; i < x; i++) {
  553. input = tabx[i];
  554. if (start->n <= input)
  555. { //jezeli element trzeba wstawic na poczatek listy
  556. Lnode *newnode=new Lnode;
  557. newnode->n = input;
  558. newnode->prev = NULL;
  559. newnode -> next = start;
  560. start->prev=newnode;
  561. start=newnode;
  562. }
  563. else if (stop->n >=input)
  564. { //jezeli element trzeba wstawic na koniec listy
  565. Lnode *newnode=new Lnode;
  566. newnode->n=input;
  567. newnode->prev=stop;
  568. newnode->next=NULL;
  569. stop->next=newnode;
  570. stop=newnode;
  571. }
  572. else
  573. { //jezeli element trzeba wstawic miedzy istniejace
  574. AddListElement (start, input);
  575. }
  576. }
  577. t_stop=clock();
  578. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  579. czas=0;
  580. t_start=clock();
  581. for (int i = 0; i < x; i++) {
  582. input = tabx[i];
  583. if (start->n == input)
  584. { //jezeli usuwany element to pierwszy z listy
  585. Lnode *temp;
  586. temp=start;
  587. start=start->next;
  588. delete temp;
  589. start->prev=NULL;
  590. }
  591.  
  592. else if (stop->n ==input)
  593. { //jezeli usuwany element to ostatni z listy
  594. FindListElement(start, stop->n); //symulacja czasu znalezienia ostatniego elementu
  595. Lnode *temp;
  596. temp=stop;
  597. stop=stop->prev;
  598. delete temp;
  599. stop->next=NULL;
  600. }
  601.  
  602. else
  603. { //jezeli usuwany jest miedzy dwoma innymi
  604. RemoveListElement (start, input);
  605. }
  606.  
  607. }
  608. t_stop = clock();
  609. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  610. cout<<czas<<endl;
  611. czas=0;
  612. }
  613. cout<<endl;
  614. for (n=50000; n<550000; n=n+25000) {
  615. cout<<n<<endl;
  616. }
  617. /*
  618. //na koniec dla porządku możemy jeszcze zaimplementować usuwanie listy, pod windowsem moze to miec znaczenie
  619. //oczywiscie poza pomiarem czasu
  620. Lnode *pom;
  621. while (start!=NULL) {
  622. pom = start;
  623. start = start -> next;
  624. delete pom;
  625. }
  626.  
  627. //praca na strukturze drzewa
  628. //dodawanie korzenia
  629. czas=0;
  630. t_start=clock();
  631. root = new Tnode;
  632. root->n = tab[0];
  633. root->left = NULL;
  634. root->right = NULL;
  635. root->up = NULL;
  636. cout<<"dodawanie elementow do drzewa"<<endl;
  637. //Nastepnie w petli dodajemy nowy element voidem ktory zdefiniowalismy wczesniej (AddElement)
  638. for (int i = 1; i < n; i++) { //i trzeba było zadeklarować przez int i
  639. addElement(root, tab[i]);
  640. }
  641. t_stop=clock();
  642. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  643. cout<<czas<<endl;
  644. cout<<"dodawanie elementow do drzewa z x"<<endl;
  645. czas=0;
  646.  
  647. t_start=clock();
  648. //Dodajemy elementy z ciągu x
  649. for (int i = 0; i < x; i++)
  650. addElement(root, tabx[i]);
  651. t_stop=clock();
  652. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  653. cout<<czas<<endl;
  654. czas=0;
  655.  
  656. //Usuwamy kolejne elementy z ciągu x
  657. t_start=clock();
  658. for (int i = 0; i < x; i++) {
  659. DeleteElementByValue(root, tabx[i]);
  660. }
  661. t_stop=clock();
  662. czas = double(t_stop - t_start) / CLOCKS_PER_SEC;
  663. cout<<czas<<endl;
  664. */
  665. }
  666. //wypisujemy wysokosc drzewa
  667. //dla drzewa idealnie zrownowazonego h = zaokraglenie w gore z log2(n)
  668. //for(n=200000; n<=295000; n=n+5000)
  669. //cout<<"h = "<<getHeight(root, 0)<<endl;
  670. //Usuwamy drzewo
  671.  
  672. //DeleteTree(root);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement