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.

262 lines
7.0 KiB

1 year 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. // Elif: Standard Konstruktor mit einem leeren Vektor initialisieren
  21. private Node head = null;
  22. private int length = 0;
  23. /**
  24. * Konstruktor mit Vektor länge 0
  25. *
  26. * @author Elif
  27. */
  28. public SparseVector() {
  29. this.head = 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.head = null;
  40. this.length = n;
  41. }
  42. /**
  43. * den value in index hinzufügen - Aktualiiseren des Wertes, wenn der head an
  44. * dem Index mit einem Wert exisitiert - Neuer head mit neuem Wert hinzufügen,
  45. * wenn der head an dem Index nicht existiert
  46. *
  47. * @author Elif
  48. * @param index Index des zu setzenden Wertes
  49. * @param value Wert, welcher eingesetzt werden soll
  50. */
  51. public void setElement(int index, double value) {
  52. removeElement(index);
  53. int maxIndex = this.getLength() - 1;
  54. if (index > maxIndex) {
  55. System.out.println("Fehler: Der Index " + index + " ist außerhalb des erlaubten Bereichs.");
  56. return;
  57. }
  58. if (this.head == null || this.head.index > index) {
  59. this.head = new Node(index, value, this.head);
  60. }
  61. // current = now
  62. Node now = this.head;
  63. while (now.next != null && now.next.index < index) {
  64. now = now.next;
  65. }
  66. // gesuchte index gefunden
  67. if (now != null && now.index == index) {
  68. now.value = value;
  69. System.out.println("at index " + index + " set value " + value);
  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. /**
  76. * return the Wert value of that index input das Index, und return den
  77. * entsprechenden Wert des Index
  78. *
  79. * @author Paul
  80. * @param index Stelle, an der der Wert steht
  81. * @return double Wert des Elements
  82. */
  83. public double getElement(int index) {
  84. if (index < 0 || index >= this.length) { // für Testfall wenn Länge < index
  85. throw new IndexOutOfBoundsException("Index " + index + " ist außerhalb der Vektorlänge " + this.length
  86. + ". Max. Index ist " + (this.length - 1));
  87. }
  88. Node now = this.head;
  89. while (now != null) {
  90. if (now.index == index) {
  91. return now.value;
  92. }
  93. now = now.next;
  94. }
  95. return 0.0;
  96. }
  97. /**
  98. * entfernt Element nach Index
  99. *
  100. * @author Leonhard
  101. * @param index Stelle des zu entferneden Elements
  102. */
  103. public void removeElement(int index) {
  104. // previous = pre
  105. Node now = this.head;
  106. Node pre = null;
  107. if (now != null && now.index == index) {
  108. this.head = now.next;
  109. return;
  110. }
  111. while (now != null && now.index != index) {
  112. pre = now;
  113. now = now.next;
  114. }
  115. if (now != null && now.index == index) {
  116. pre.next = now.next;
  117. // System.out.println("index " + index + " found and the value " + now.value + "
  118. // deleted.");
  119. } else {
  120. // System.out.println("Element not found with index " + index);
  121. }
  122. }
  123. /**
  124. * Länge des Vektors ausgeben
  125. *
  126. * @author Leonhard
  127. * @return int [Beschreibung]
  128. */
  129. public int getLength() {
  130. int length = SparseVector.this.length;
  131. return length;
  132. }
  133. /**
  134. * testen, ob other = this (nur vergleichen die Nicht-Null Elemente)
  135. *
  136. * @author Terry
  137. * @param other Anderer Vektor, mit dem verglichen wird
  138. * @return boolean Wahrheitswert, ob Vektoren gleich sind
  139. */
  140. public boolean equals(SparseVector other) {
  141. if (this.getLength() != other.getLength()) {
  142. return false;
  143. }
  144. Node thisnow = this.head;
  145. Node othernow = other.head;
  146. while (thisnow != null || othernow != null) {
  147. if (thisnow != null && othernow != null) {
  148. if (!(thisnow.index == othernow.index && thisnow.value == othernow.value)) {
  149. return false;
  150. }
  151. thisnow = thisnow.next;
  152. othernow = othernow.next;
  153. // wenn die Anzahl der Positionen mit Nicht-Null-Elementen nicht übereinstimmen
  154. // = nicht identisch
  155. } else if ((thisnow != null && othernow == null) || (othernow != null && thisnow == null)) {
  156. return false;
  157. }
  158. }
  159. return true;
  160. }
  161. /**
  162. * to add two vectors together and renew (overwrite) the this.vector
  163. *
  164. * @author Terry
  165. * @param other Anderer Vektor, der auf addiert wird
  166. */
  167. public void add(SparseVector other) {
  168. Node thisnow = this.head;
  169. Node othernow = other.head;
  170. Node thispre = null;
  171. // Fall 0: 2 Vektoren mit unterschiedlichen Längen geht nicht!
  172. if (this.getLength() != other.getLength()) {
  173. System.out.println("Vektoren mit unterschiedlichen Längen können nicht zusammen addiert werden!!");
  174. System.out.println(
  175. "Länge des controlVector: " + this.getLength() + " aber die von otherVector: " + other.getLength());
  176. return;
  177. }
  178. while (thisnow != null && othernow != null) {
  179. // Fall 1, gleicher Index, dann nur Werte zusammen addieren → update this Vektor
  180. if (thisnow.index == othernow.index) {
  181. thisnow.value += othernow.value; // overwrite the this. value
  182. thispre = thisnow;
  183. thisnow = thisnow.next;
  184. othernow = othernow.next;
  185. }
  186. // Fall 2: Der Index von othernow ist kleiner, füge diesen Knoten in this ein
  187. else if (othernow.index < thisnow.index) {
  188. Node newNode = new Node(othernow.index, othernow.value, thisnow);
  189. if (thispre == null) {
  190. this.head = newNode;
  191. } else {
  192. thispre.next = newNode;
  193. }
  194. // this Vektor Zeiger und other Vektor Zeiger gehen weiter voran
  195. othernow = othernow.next;
  196. thispre = newNode;
  197. // Fall 3: Der Index von othernow > thisnow, 2 Zeiger gehen weiter
  198. } else if (othernow.index > thisnow.index) {
  199. thispre = thisnow;
  200. thisnow = thisnow.next;
  201. }
  202. }
  203. }
  204. }