You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
7.3 KiB

1 year ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
1 year ago
  1. /**
  2. * Sparse Implementierung einer verkettete Liste
  3. */
  4. public class SparseVector {
  5. /**
  6. * Hilfsklasse, welche ein einzelnes Node repräsentiert.
  7. *
  8. * @author Paul
  9. */
  10. private class Node {
  11. int index;
  12. double value;
  13. Node next;
  14. public Node(int index, double value, Node next) {
  15. this.index = index;
  16. this.value = value;
  17. this.next = next;
  18. }
  19. }
  20. // Standard Konstruktor mit einem leeren Vektor initialisieren
  21. private Node firstNode = null;
  22. private int length = 0;
  23. /**
  24. * Konstruktor mit Vektor länge 0
  25. *
  26. * @author Elif
  27. */
  28. public SparseVector() {
  29. this.firstNode = null;
  30. this.length = 0;
  31. }
  32. /**
  33. * Konstruktor mit Vektor länge n
  34. *
  35. * @author Elif
  36. * @param n Vektor länge
  37. */
  38. public SparseVector(int n) {
  39. this.firstNode = null;
  40. this.length = n;
  41. }
  42. /* den value in index hinzufügen
  43. - Aktualiiseren des Wertes, wenn der firstNode an dem Index mit einem Wert exisitiert
  44. - Neuer firstNode mit neuem Wert hinzufügen, wenn der firstNode an dem Index nicht existiert
  45. */
  46. public void setElement(int index, double value) {
  47. // methode wird aufgerufen, falls index existiert = platz schaffen
  48. removeElement(index);
  49. int maxIndex = this.getLength() - 1;
  50. // 1. if: schauen, ob Index im erlaubten Bereich
  51. //2. if: schauen, ob erster Knoten null ist und index von erstem knoten größer als index, dann neuen knoten setzen
  52. if (index > maxIndex) {
  53. System.out.println("Fehler: Der Index " + index + " ist außerhalb des erlaubten Bereichs.");
  54. return;
  55. }
  56. if (this.firstNode == null || this.firstNode.index > index) {
  57. this.firstNode = new Node(index, value, this.firstNode);
  58. }
  59. //hilfsknoten erstellen
  60. //solange im index und gesuchten index nicht erreicht haben, gehen wir weiter
  61. Node now = this.firstNode;
  62. while (now.next != null && now.next.index < index) {
  63. now = now.next;
  64. }
  65. // gesuchte index gefunden
  66. if (now != null && now.index == index) {
  67. now.value = value;
  68. System.out.println("at index " + index + " set value " + value);
  69. // knoten den wir erstellen wollten existiert nicht, deshlab new node
  70. } else if (now.next == null || now.next.index > index) {
  71. now.next = new Node(index, value, now.next);
  72. System.out.println("at index " + index + " set value " + value);
  73. }
  74. }
  75. /* getElement: return the Wert value of that index
  76. input das Index, und return den entsprechenden Wert des Index
  77. */
  78. public double getElement(int index) {
  79. if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index
  80. throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length
  81. + ". Max. Index ist " + (this.length - 1));
  82. }
  83. Node now = this.firstNode;
  84. while (now != null) {
  85. if (now.index == index) {
  86. return now.value;
  87. }
  88. now = now.next;
  89. }
  90. return 0.0;
  91. }
  92. /**
  93. * entfernt Element nach Index
  94. *
  95. * @author Leonhard
  96. * @param index Stelle des zu entferneden Elements
  97. */
  98. public void removeElement(int index) {
  99. // Anlegen der jetzigen und vorherigen Node
  100. Node now = this.firstNode;
  101. Node pre = null;
  102. // Wenn der momentane Node nicht Null ist und der gesuchte Index korrekt ist
  103. // ersetze den momentanen Node durch den nächsten
  104. if (now != null && now.index == index) {
  105. this.firstNode = now.next;
  106. return;
  107. }
  108. while (now != null && now.index != index) {
  109. pre = now;
  110. now = now.next;
  111. }
  112. if (now != null && now.index == index) {
  113. pre.next = now.next;
  114. // System.out.println("index " + index + " found and the value " + now.value + " deleted.");
  115. } else {
  116. // System.out.println("Element not found with index " + index);
  117. }
  118. }
  119. // Länge des Vektors ausgeben
  120. public int getLength() {
  121. int length = SparseVector.this.length;
  122. return length;
  123. }
  124. // bool Methode equals: testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  125. public boolean equals(SparseVector other) {
  126. if (this.getLength() != other.getLength()) {
  127. return false;
  128. }
  129. Node thisnow = this.firstNode;
  130. Node othernow = other.firstNode;
  131. while (thisnow != null || othernow != null) {
  132. if (thisnow != null && othernow != null) {
  133. if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) {
  134. return false;
  135. }
  136. thisnow = thisnow.next;
  137. othernow = othernow.next;
  138. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen
  139. // = nicht identisch
  140. } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) {
  141. return false;
  142. }
  143. }
  144. return true;
  145. }
  146. // void add: to add two vectors together and renew (overwrite) the this.vector
  147. public void add(SparseVector other) {
  148. Node thisnow = this.firstNode;
  149. Node othernow = other.firstNode;
  150. Node thispre = null;
  151. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  152. if (this.getLength() != other.getLength()) {
  153. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  154. System.out.println(
  155. "Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  156. return;
  157. }
  158. while (thisnow != null && othernow != null) {
  159. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  160. if (thisnow.index == othernow.index) {
  161. thisnow.value += othernow.value; // overwrite the this. value
  162. thispre = thisnow;
  163. thisnow = thisnow.next;
  164. othernow = othernow.next;
  165. }
  166. // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein
  167. else if (othernow.index < thisnow.index) {
  168. Node newNode = new Node(othernow.index, othernow.value, thisnow);
  169. if (thispre == null) {
  170. this.firstNode = newNode;
  171. } else {
  172. thispre.next = newNode;
  173. }
  174. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  175. othernow = othernow.next;
  176. thispre = newNode;
  177. // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter
  178. } else if (othernow.index > thisnow.index) {
  179. thispre = thisnow;
  180. thisnow = thisnow.next;
  181. }
  182. }
  183. }
  184. }