gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: bb522db)
raw | patch | inline | side by side (parent: bb522db)
author | Doni Pracner <quinnuendo@gmail.com> | |
Tue, 15 May 2018 22:37:17 +0000 (00:37 +0200) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Tue, 15 May 2018 22:37:17 +0000 (00:37 +0200) |
kodovi/kolekcije/ListCompare.java | patch | blob | history |
index 8a04c04055b9765b45d2473def13571d7466cbc1..2059d059f7d791314635b2da460f3286365ead6f 100644 (file)
/**
* Primeri razlicitih operacija na klasama ArrayList i LinkedList i poredjenje
* performansi nad istim podacima.
- *
+ *
* U nekim primerima se koriste i sopstvene implementacije klasa za poredjenje
* sa ugradjenima.
- *
+ *
* NAPOMENA: merenje vremena izvrsavanja u opstem slucaju nije najpouzdanije,
* posto racunar skoro nikad ne izvrsava samo taj jedan program.
- *
+ *
* Druga bitna stvar je da je Java virtuelna masina napravljena tako da
* optimizuje samu sebe u skladu sa kodom koji se izvrsava. Zbog toga postoji i
* pojam "hladne masine" koja jos nije stigla da se optimizuje uopste. Ali ovaj
* proces se stalno desava, tako da ako se dugo radi slican kod, a potom promeni
* na nesto drugo to drugo ce inicijalno biti sporije dok se ne re-optimizuje.
- *
+ *
* Bez obzira na sve te napomene, ovi testovi bi trebalo da relativno jasno
* prikazu odnose brzina koristeci ponavljanje testova veliki broj puta i
* primenjujuci ih razlicitim redosledom na strukture.
*/
public class ListCompare {
- private static final int SEQ_LENGTH = 100;
+ private static final int SEQ_LENGTH = 500;
private static final int TEST_NUMBER = 100;
public static void main(String[] args) {
// generate random sequence of numbers
int[] seq = genRandomSequence(SEQ_LENGTH, new Random(123456789));
// insert into ArrayList and LinkedList
+ System.out.println("--- ubacivanje ---");
compareNormalInsertion();
- compareContains(10000);
+ System.out.println("--- contains operacija ---");
+ compareContains(1000);
+ System.out.println("--- sortirano ubacivanje ---");
compareSortedInsertion(seq);
- System.out.println("custom insertion\n :" + customSortedInsertionTestMulti(seq, TEST_NUMBER));
- System.out.println("custom insertion\n :" + customSortedInsertionTestMulti(seq, TEST_NUMBER));
+ System.out.printf("custom insertion%n :%1$10.2f%n", customSortedInsertionTestMulti(seq, TEST_NUMBER));
+ System.out.printf("custom insertion%n :%1$10.2f%n", customSortedInsertionTestMulti(seq, TEST_NUMBER));
+ System.out.println("--- uklanjanja ---");
compareRemoval(10000);
}
- private static double customSortedInsertionTestMulti(int[] seq, int numtests) {
+ private static int[] genRandomSequence(int length, Random r) {
+ int[] rez = new int[length];
+ for (int i = 0; i < length; i++)
+ rez[i] = r.nextInt(length);
+ return rez;
+ }
+
+ private static void compareNormalInsertion() {
+ int[] seq = genRandomSequence(10 * SEQ_LENGTH, new Random(123456789));
+ ArrayList<Integer> al = new ArrayList<>();
+ LinkedList<Integer> ll = new LinkedList<>();
+ int nt = TEST_NUMBER;
+ System.out.println("Normal insertion test");
+ System.out.printf("ll:%1$10.2f%n", insertionTestMulti(ll, seq, nt));
+ System.out.printf("al:%1$10.2f%n", insertionTestMulti(al, seq, nt));
+ System.out.printf("al:%1$10.2f%n", insertionTestMulti(al, seq, nt));
+ System.out.printf("ll:%1$10.2f%n", insertionTestMulti(ll, seq, nt));
+ }
+
+ private static double insertionTestMulti(List<Integer> l, int[] seq, int testNumber) {
long sum = 0;
- for (int i = 0; i < numtests; i++) {
- sum += customSortedInsertion(seq);
+ for (int i = 0; i < testNumber; i++) {
+ try {
+ l = l.getClass().newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ sum += insertionTest(l, seq);
+
}
- return ((double) sum) / numtests;
+ return ((double) sum) / testNumber;
}
- private static long customSortedInsertion(int[] seq) {
- SortiranaListaBrojeva slb = new SortiranaListaBrojeva();
+ private static long insertionTest(List<Integer> l, int[] seq) {
long startTime = System.nanoTime();
- for (int i : seq) {
- slb.dodaj(i);
- }
+ for (int i : seq)
+ l.add(0, i);
return System.nanoTime() - startTime;
}
LinkedList<Integer> ll = new LinkedList<>();
System.out.println("Sorted insertion test");
- System.out.println("ll:" + sortedInsertionTestMulti(ll, seq, TEST_NUMBER));
- System.out.println("al:" + sortedInsertionTestMulti(al, seq, TEST_NUMBER));
- System.out.println("al:" + sortedInsertionTestMulti(al, seq, TEST_NUMBER));
- System.out.println("ll:" + sortedInsertionTestMulti(ll, seq, TEST_NUMBER));
+ System.out.printf("ll:%1$10.2f%n", sortedInsertionTestMulti(ll, seq, TEST_NUMBER));
+ System.out.printf("al:%1$10.2f%n", sortedInsertionTestMulti(al, seq, TEST_NUMBER));
+ System.out.printf("al:%1$10.2f%n", sortedInsertionTestMulti(al, seq, TEST_NUMBER));
+ System.out.printf("ll:%1$10.2f%n", sortedInsertionTestMulti(ll, seq, TEST_NUMBER));
}
- private static void compareNormalInsertion() {
- int[] seq = genRandomSequence(10 * SEQ_LENGTH, new Random(123456789));
- ArrayList<Integer> al = new ArrayList<>();
- LinkedList<Integer> ll = new LinkedList<>();
- int nt = TEST_NUMBER;
- System.out.println("Normal insertion test");
- System.out.println("ll:" + insertionTestMulti(ll, seq, nt));
- System.out.println("al:" + insertionTestMulti(al, seq, nt));
- System.out.println("al:" + insertionTestMulti(al, seq, nt));
- System.out.println("ll:" + insertionTestMulti(ll, seq, nt));
+ private static double sortedInsertionTestMulti(List<Integer> l, int[] seq, int numtests) {
+ long sum = 0;
+ for (int i = 0; i < numtests; i++) {
+ try {
+ l = l.getClass().newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ sum += sortedInsertionTest(l, seq);
+
+ }
+ return ((double) sum) / numtests;
+ }
+
+ private static long sortedInsertionTest(List<Integer> l, int[] seq) {
+ long startTime = System.nanoTime();
+ for (int i : seq)
+ insertSorted(i, l);
+ return System.nanoTime() - startTime;
+ }
+
+ private static void insertSorted(int num, List<Integer> l) {
+ int i = 0;
+ while (i < l.size() && l.get(i) < num) {
+ i++;
+ }
+ l.add(i, num);
+ }
+
+ private static double customSortedInsertionTestMulti(int[] seq, int numtests) {
+ long sum = 0;
+ for (int i = 0; i < numtests; i++) {
+ sum += customSortedInsertion(seq);
+ }
+ return ((double) sum) / numtests;
+ }
+
+ private static long customSortedInsertion(int[] seq) {
+ SortiranaListaBrojeva slb = new SortiranaListaBrojeva();
+ long startTime = System.nanoTime();
+ for (int i : seq) {
+ slb.dodaj(i);
+ }
+ return System.nanoTime() - startTime;
}
private static void compareRemoval(int seqLength) {
System.out.printf("al:%1$10.2f\n", removalTestMulti(al, seqLength + 2, testNumber, perc));
}
- private static double sortedInsertionTestMulti(List<Integer> l, int[] seq, int numtests) {
- long sum = 0;
- for (int i = 0; i < numtests; i++) {
- try {
- l = l.getClass().newInstance();
- } catch (InstantiationException | IllegalAccessException e) {
- e.printStackTrace();
- }
- sum += sortedInsertionTest(l, seq);
-
- }
- return ((double) sum) / numtests;
- }
-
- private static long sortedInsertionTest(List<Integer> l, int[] seq) {
- long startTime = System.nanoTime();
- for (int i : seq)
- insertSorted(i, l);
- return System.nanoTime() - startTime;
- }
-
- private static void insertSorted(int num, List<Integer> l) {
- int i = 0;
- while (i < l.size() && l.get(i) < num) {
- i++;
- }
- l.add(i, num);
- }
-
- private static double insertionTestMulti(List<Integer> l, int[] seq, int testNumber) {
- long sum = 0;
- for (int i = 0; i < testNumber; i++) {
- try {
- l = l.getClass().newInstance();
- } catch (InstantiationException | IllegalAccessException e) {
- e.printStackTrace();
- }
- sum += insertionTest(l, seq);
-
- }
- return ((double) sum) / testNumber;
- }
-
- private static long insertionTest(List<Integer> l, int[] seq) {
- long startTime = System.nanoTime();
- for (int i : seq)
- l.add(0, i);
- return System.nanoTime() - startTime;
- }
-
private static double removalTestMulti(List<Integer> l, int num, int testNumber, double percentWhere) {
long sum = 0;
for (int i = 0; i < testNumber; i++) {
return ((double) sum) / testNumber;
}
- private static int[] genRandomSequence(int length, Random r) {
- int[] rez = new int[length];
- for (int i = 0; i < length; i++)
- rez[i] = r.nextInt(length);
- return rez;
- }
-
private static void compareContains(int seqLength) {
int[] seq = genRandomSequence(seqLength, new Random(123456789));
}
System.out.println("nepostojeci:");
- System.out.println("contains al:" + containsTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("contains ll:" + containsTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("for-rucn al:" + forSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("for-rucn ll:" + forSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("for-each al:" + forEachSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("for-each ll:" + forEachSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("contains al:%1$10.2f%n" , containsTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("contains ll:%1$10.2f%n" , containsTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-rucn al:%1$10.2f%n" , forSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-rucn ll:%1$10.2f%n" , forSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-each al:%1$10.2f%n" , forEachSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-each ll:%1$10.2f%n" , forEachSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("custom sort:" + customContainsSortedTestMulti(l, seqLength + 1, TEST_NUMBER));
+ System.out.printf("custom sort:%1$10.2f%n" , customContainsSortedTestMulti(l, seqLength + 1, TEST_NUMBER));
al.set(seqLength / 3, seqLength + 1);
ll.set(seqLength / 3, seqLength + 1);
+ // ovaj moramo uzeti jer je sortirano
+ int el3 = l.element(seqLength / 3);
System.out.println("postojeci:");
- System.out.println("contains al:" + containsTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("contains ll:" + containsTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("for-rucn al:" + forSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("for-rucn ll:" + forSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("for-each al:" + forEachSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
- System.out.println("for-each ll:" + forEachSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("contains al:%1$10.2f%n" , containsTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("contains ll:%1$10.2f%n" , containsTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-rucn al:%1$10.2f%n" , forSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-rucn ll:%1$10.2f%n" , forSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-each al:%1$10.2f%n" , forEachSearchTestMulti(al, seqLength + 1, TEST_NUMBER));
+ System.out.printf("for-each ll:%1$10.2f%n" , forEachSearchTestMulti(ll, seqLength + 1, TEST_NUMBER));
- System.out.println("custom sort:" + customContainsSortedTestMulti(l, seqLength + 1, TEST_NUMBER));
+ System.out.printf("custom sort:%1$10.2f%n" , customContainsSortedTestMulti(l, el3, TEST_NUMBER));
}
private static double containsTestMulti(List<Integer> l, int num, int numTests) {
while (prethodni.veza != null && prethodni.veza.info.compareTo(s) < 0) {
prethodni = prethodni.veza;
}
- if (prethodni.veza == null || !prethodni.veza.info.equals(s)) {
- Element novi = new Element(s);
- novi.veza = prethodni.veza;
- prethodni.veza = novi;
- }
+ Element novi = new Element(s);
+ novi.veza = prethodni.veza;
+ prethodni.veza = novi;
}
}
}
+ public int element(int k) {
+ if (k < 0) {
+ throw new IndexOutOfBoundsException(
+ "Ne postoje elementi na negativnim pozicijama!");
+ }
+
+ Element tekuci = prvi;
+ int brojac = 0;
+
+ while (tekuci != null && k > brojac) {
+ tekuci = tekuci.veza;
+ brojac++;
+ }
+
+ if (tekuci != null) {
+ return tekuci.info;
+ } else {
+ throw new IndexOutOfBoundsException("Lista je kraca od "
+ + k);
+ }
+ }
+
/** Vraca da li String {@code s} postoji u listi. */
public boolean uListi(int s) {
Element tekuci = prvi;