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.

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