Algorithmen - Mehrfachbaum

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Algorithmen - Mehrfachbaum

    Hi,

    hier meine Version des Mehrfachbaums...

    Datei: MultiNode.java

    Quellcode

    1. package U8;
    2. import java.util.Iterator;
    3. import java.util.LinkedList;
    4. /**
    5. * <p>
    6. * <b>Organisation:</b> FH-Wiesbaden<br>
    7. * <b>Homepage:</b> <a href="http://www.fh-wiesbaden.de">www.fh-wiesbaden.de</a><br>
    8. * <b>Fachbereich:</b> 06 - Meieninformatik<br>
    9. * </p>
    10. * <p>
    11. * <b>Entwickler:</b> Berntheisel, Stefan<br>
    12. * </p>
    13. * <p>
    14. * <b>Programm:</b><i> MultiNode </i><br>
    15. * </p>
    16. *
    17. * @author sbern001 (Username)
    18. * @version 1.0
    19. * @docRoot .
    20. */
    21. public class MultiNode {
    22. private char key;
    23. private LinkedList<MultiNode> SubNode = new LinkedList<MultiNode>();
    24. private String leaf;
    25. private int wordcounter = 1;
    26. // Konstruktor 1
    27. public MultiNode(char key) {
    28. this.key = key;
    29. }
    30. // Konstruktor 2
    31. public MultiNode(char key, String leaf) {
    32. this.key = key;
    33. this.leaf = leaf;
    34. }
    35. // Gibt den Wert des Schluessels zurueck
    36. public char getKey() {
    37. return key;
    38. }
    39. // Gibt den Wert des Blattes zurueck
    40. public String getLeaf() {
    41. return leaf;
    42. }
    43. // Setzt den Wert des Blattes
    44. public void setLeaf(String leaf) {
    45. this.leaf = leaf;
    46. }
    47. // Loescht das Blatt
    48. public void delLeaf() {
    49. this.leaf = null;
    50. this.wordcounter = 1;
    51. }
    52. // Gibt die Anzahl der Wort vorkommen zurueck
    53. public int getWordcounter() {
    54. return wordcounter;
    55. }
    56. // Legt die Anzahl der Wort wiederholungen fest
    57. public void setWordcounter(int wordcounter) {
    58. this.wordcounter = wordcounter;
    59. }
    60. // Erhoeht den Wort zaehler
    61. public void stepUpWordcounter() {
    62. this.wordcounter++;
    63. }
    64. // Fuegt neuen Knoten in die Liste
    65. public void addNode(MultiNode note) {
    66. SubNode.add(note);
    67. }
    68. // Prueft ob die Liste leer ist
    69. public boolean isNodeListEmpty () {
    70. return SubNode.isEmpty();
    71. }
    72. // Prueft ob der gesuchte Knoten in der Liste ist
    73. public boolean isNodeInList (char key) {
    74. MultiNode node = null;
    75. Iterator it = SubNode.iterator();
    76. while(it.hasNext()) {
    77. node = (MultiNode) it.next();
    78. if(node.getKey() == key)
    79. return true;
    80. }
    81. return false;
    82. }
    83. // Gibt den Knoten des gesuchten Schluessels zurueck
    84. public MultiNode findNode (char key) {
    85. MultiNode node = null;
    86. Iterator it = SubNode.iterator();
    87. while(it.hasNext()) {
    88. node = (MultiNode) it.next();
    89. if(node.getKey() == key)
    90. return node;
    91. }
    92. return node;
    93. }
    94. // Gibt alle vorhanden Schluessel zurueck
    95. public String findKeys () {
    96. String liste = "";
    97. int counter = 0;
    98. if(!isNodeListEmpty()) {
    99. MultiNode node = null;
    100. Iterator it = SubNode.iterator();
    101. while(it.hasNext()) {
    102. node = (MultiNode) it.next();
    103. liste += node.getKey();
    104. counter++;
    105. }
    106. }
    107. return liste;
    108. }
    109. }
    Alles anzeigen


    Datei: SearchTrie.java

    Quellcode

    1. package U8;
    2. import java.util.Iterator;
    3. import java.util.List;
    4. import java.util.LinkedList;
    5. /**
    6. * <p>
    7. * <b>Organisation:</b> FH-Wiesbaden<br>
    8. * <b>Homepage:</b> <a href="http://www.fh-wiesbaden.de">www.fh-wiesbaden.de</a><br>
    9. * <b>Fachbereich:</b> 06 - Meieninformatik<br>
    10. * </p>
    11. * <p>
    12. * <b>Entwickler:</b> Berntheisel, Stefan<br>
    13. * </p>
    14. * <p>
    15. * <b>Programm:</b><i> SearchTrie </i><br>
    16. * </p>
    17. *
    18. * @author sbern001 (Username)
    19. * @version 1.0
    20. * @docRoot .
    21. */
    22. public class SearchTrie implements STrie {
    23. private final char ROOT_PREFIX = '.';
    24. private final char MAIN_PREFIX = '.';
    25. private final boolean CASESENSITV;
    26. private MultiNode root = new MultiNode(ROOT_PREFIX);
    27. private int emptystring = 0;
    28. private int allwords = 0;
    29. private int words = 0;
    30. /**
    31. * Konstruktor
    32. * @param casesensitv true/false
    33. */
    34. SearchTrie(boolean casesensitv) {
    35. this.CASESENSITV = casesensitv;
    36. }
    37. /**
    38. * Gibt den aufbau des Mehrfachbaums auf der Console aus
    39. */
    40. public void showTree () {
    41. showTree(root, "");
    42. }
    43. /**
    44. * Gibt den aufbau des Mehrfachbaums auf der Console aus
    45. * @param node Knoten (nur fuer rekursiven Aufruf)
    46. * @param path aktueller Pfad (nur fuer rekursiven Aufruf)
    47. */
    48. private void showTree (MultiNode node, String path) {
    49. char keys[] = node.findKeys().toCharArray();
    50. char full_path[] = path.toCharArray();
    51. for(int i = 0; i < keys.length; i++) {
    52. String string_path = "";
    53. MultiNode t = node.findNode(keys[i]);
    54. for(int j = 0; j < full_path.length; j++)
    55. string_path += "(" + full_path[j] + ")" + "-->";
    56. if(t.getLeaf() != null) {
    57. System.out.printf("ROOT-->%s(%s) = %s (Anz: %d)\n", string_path, t.getKey(), t.getLeaf(), t.getWordcounter());
    58. }
    59. if(t.getLeaf() == null)
    60. showTree(t, path + keys[i]);
    61. }
    62. }
    63. /**
    64. * Gibt die Anzahl der leeren Strings zurueck
    65. * @return Anzahl leere Strings
    66. */
    67. public int getEmptyStrin () {
    68. return this.emptystring;
    69. }
    70. /**
    71. * Füge ein neues Wort in den Mehrfachbaum ein
    72. * @param s Wort
    73. */
    74. public void add(String s) {
    75. // Leer String kann nicht in den Baum eingefuegt werden
    76. if(s.equals("")) {
    77. emptystring++;
    78. return;
    79. }
    80. // Wandelt die Grossbuchstaben in Kleinbuchstaben
    81. if(CASESENSITV)
    82. s.toLowerCase();
    83. MultiNode node = root;
    84. char word[] = s.toCharArray();
    85. int counter = 0;
    86. // Die Schleife hangelt sich durch die Praefixe und vergleicht jeden Buchstabe
    87. // des neuen Wortes mit der in dem Baum erstellten Struktur. Wird eine Stelle gefunden,
    88. // an der das neue Wort vom vorhandenen Baum abweicht, so wurde die Stelle gefunden,
    89. // an der das neue Wort eingefuegt wird.
    90. while(counter <= word.length - 1 && !node.isNodeListEmpty() && node.isNodeInList(word[counter])) {
    91. node = node.findNode(word[counter]);
    92. counter++;
    93. // Prueft den aktuellen Knoten und schaut, ob das neue
    94. // Wort schon im Baum existiert. Wenn Ja, dann wird
    95. // die Anzahl um +1 erhoeht und abgebrochen.
    96. if(node.getLeaf() != null && node.getLeaf().equals(s)) {
    97. node.stepUpWordcounter();
    98. allwords++;
    99. return;
    100. }
    101. else if(node.isNodeInList(MAIN_PREFIX)) {
    102. MultiNode temp = node.findNode(MAIN_PREFIX);
    103. if(temp.getLeaf() != null && temp.getLeaf().equals(s)) {
    104. temp.stepUpWordcounter();
    105. allwords++;
    106. return;
    107. }
    108. }
    109. }
    110. // Wenn kein Blatt an dem aktuellen Knoten vorhanden ist, dann
    111. // kann das neue Wort an die aktuelle Stelle eingebunden werden.
    112. if(node.getLeaf() == null) {
    113. // 1. Fall
    114. // Wenn der aktuelle Knotenen den Schluessel des letzten Bruchstaben
    115. // des neuen Wortes hat, wird das neue Wort als Hauptpraefix eingefuegt.
    116. if(counter == s.length()) {
    117. MultiNode newWord = new MultiNode(MAIN_PREFIX);
    118. newWord.setLeaf(s);
    119. node.addNode(newWord);
    120. this.allwords++;
    121. this.words++;
    122. }
    123. // 2. Fall
    124. // Haengt an den aktuellen Schuessel das neue Wort
    125. else{
    126. MultiNode newWord = new MultiNode(word[counter]);
    127. newWord.setLeaf(s);
    128. node.addNode(newWord);
    129. this.allwords++;
    130. this.words++;
    131. }
    132. }
    133. else {
    134. // Speichern der Blatt informationen
    135. String temp_s = node.getLeaf();
    136. char temp_word[] = temp_s.toCharArray();
    137. int temp_wordcounter = node.getWordcounter();
    138. // Blatt loeschen
    139. node.delLeaf();
    140. // Praefix sollange erweitern bis neues Wort ungleich altes Wort ist
    141. while(counter <= s.length() - 1 && counter <= temp_s.length() - 1 && word[counter] == temp_word[counter]) {
    142. MultiNode temp = new MultiNode(word[counter]);
    143. node.addNode(temp);
    144. node = node.findNode(word[counter]);
    145. counter++;
    146. }
    147. MultiNode newWord;
    148. MultiNode newTempWord;
    149. if(counter == s.length() && counter < temp_s.length()) {
    150. newWord = new MultiNode(MAIN_PREFIX);
    151. newTempWord = new MultiNode(temp_word[counter]);
    152. this.allwords++;
    153. this.words++;
    154. }
    155. else if(counter == temp_s.length() && counter < s.length()) {
    156. newWord = new MultiNode(word[counter]);
    157. newTempWord = new MultiNode(MAIN_PREFIX);
    158. this.allwords++;
    159. this.words++;
    160. }
    161. else {
    162. newWord = new MultiNode(word[counter]);
    163. newTempWord = new MultiNode(temp_word[counter]);
    164. this.allwords++;
    165. this.words++;
    166. }
    167. newWord.setLeaf(s);
    168. newTempWord.setLeaf(temp_s);
    169. newTempWord.setWordcounter(temp_wordcounter);
    170. node.addNode(newWord);
    171. node.addNode(newTempWord);
    172. }
    173. }
    174. /**
    175. * Wie häufig kommt s vor?
    176. * @param s Wort
    177. * @return Häufigkeit Vorkommen
    178. */
    179. public int count(String s) {
    180. if(s == null || s.length() < 0 )
    181. return 0;
    182. if(s.equals(""))
    183. return emptystring;
    184. char word[] = s.toCharArray();
    185. int counter = 0;
    186. MultiNode node = root;
    187. while(counter < word.length - 1 && !node.isNodeListEmpty() && node.isNodeInList(word[counter])) {
    188. node = node.findNode(word[counter]);
    189. counter++;
    190. }
    191. if(node.getLeaf() != null && node.getLeaf().equals(s))
    192. return node.getWordcounter();
    193. if(node.isNodeInList(word[counter])) {
    194. node = node.findNode(word[counter]);
    195. if(node.getLeaf() != null && node.getLeaf().equals(s))
    196. return node.getWordcounter();
    197. if(node.isNodeInList(MAIN_PREFIX)) {
    198. node = node.findNode(MAIN_PREFIX);
    199. if(node.getLeaf() != null && node.getLeaf().equals(s))
    200. return node.getWordcounter();
    201. }
    202. }
    203. return 0;
    204. }
    205. /**
    206. * Entferne alle Vorkommen
    207. * @param s Wort
    208. * @return true gdw s mindestens einmal vorkam
    209. */
    210. public boolean remove(String s) {
    211. return false;
    212. }
    213. /**
    214. * Anzahl der Vorkommen aller Wörter
    215. * @return Anzahl alle Vorkommen
    216. */
    217. public int noOccurences() {
    218. return allwords;
    219. }
    220. /**
    221. * Anzahl der verschiedenen Wörter
    222. * @return Anzahl verschiedener Wörter
    223. */
    224. public int noWords() {
    225. return words;
    226. }
    227. /**
    228. * Iteriere über die vorkommenden Objekte
    229. * @return Iterator
    230. */
    231. public Iterator iterator() {
    232. return new Iterator() {
    233. private List<MultiNode> list = new LinkedList<MultiNode>();
    234. private Iterator it;
    235. private boolean buildIterator = false;
    236. private void buildIteratorArray() {
    237. buildIteratorArray(root);
    238. }
    239. private void buildIteratorArray(MultiNode node) {
    240. char keys[] = node.findKeys().toCharArray();
    241. for(int i = 0; i < keys.length; i++) {
    242. MultiNode t = node.findNode(keys[i]);
    243. if(t.getLeaf() != null) {
    244. list.add(t);
    245. }
    246. else
    247. buildIteratorArray(t);
    248. }
    249. }
    250. public boolean hasNext() {
    251. if(!buildIterator) {
    252. buildIteratorArray();
    253. it = list.iterator();
    254. buildIterator = true;
    255. }
    256. return it.hasNext();
    257. }
    258. public Object next() {
    259. MultiNode t = (MultiNode)it.next();
    260. return t.getLeaf();
    261. }
    262. public void remove() {
    263. // TODO Auto-generated method stub
    264. }
    265. };
    266. }
    267. }
    Alles anzeigen


    Datei: WordCount.java

    Quellcode

    1. package U8;
    2. import java.util.Map;
    3. import java.util.HashMap;
    4. import java.util.Iterator;
    5. import fhw.*;
    6. /**
    7. * @author Peter Barth
    8. * Testet die SearchList Implementierung
    9. * Einfach nur benutzen...
    10. */
    11. //--> geaenderte Version von sbern001
    12. public class WordCount {
    13. /**
    14. * @param args Dateinamen die zu verarbeiten sind
    15. */
    16. public static void main(String[] args) {
    17. String[] dateien =
    18. {
    19. "Woerter.txt",
    20. "AMidSummersNightDream.txt",
    21. "RomeoAndJuliet.txt",
    22. "words.txt"
    23. };
    24. if (args.length > 0)
    25. dateien = args;
    26. for (String datei : dateien) {
    27. test(datei, ADSTool.readStringArray("U8/" + datei));
    28. }
    29. }
    30. static String format = "%30s | %6s %6s | %10s | %10s | %10s | %10s\n";
    31. static String splitregex = "[ \t\n,:.]+";
    32. static boolean test(String name, String[] zeilen) {
    33. String anzahl, verschiedene, einfuegen, iterieren, zugriff, loeschen;
    34. int count = 0;
    35. SearchTrie sl = new SearchTrie(true); // Testet Ihre Implementierung
    36. Map hm = makeMap(zeilen); // Zum Gegentesten
    37. ADSTool.resetTime();
    38. for (int j = 0; j < zeilen.length; j++) {
    39. String[] woerter = zeilen[j].split(splitregex);
    40. for (int k = 0; k < woerter.length; k++) {
    41. // System.out.println(woerter[k]);
    42. sl.add(woerter[k]);
    43. count++;
    44. }
    45. }
    46. anzahl = Integer.toString(sl.noOccurences());
    47. verschiedene = Integer.toString(sl.noWords());
    48. sl.showTree(); // Zeigt die Struktur des Baums
    49. einfuegen = ADSTool.stringRTime();
    50. Iterator it = sl.iterator();
    51. count -= sl.getEmptyStrin();
    52. while (it.hasNext()) {
    53. String s = (String) it.next();
    54. int i = sl.count(s);
    55. count -= i;
    56. }
    57. iterieren = ADSTool.stringRTime();
    58. if (count != 0) {
    59. System.out.println("Fehler - Anzahl der Einträge " + count);
    60. return false;
    61. }
    62. it = hm.keySet().iterator();
    63. while (it.hasNext()) {
    64. String s = (String) it.next();
    65. int hmcount = ((Integer) hm.get(s)).intValue();
    66. if (hmcount != sl.count(s)) {
    67. System.err.println("Fehler - Anzahl der Vorkommen bei" + s);
    68. System.err.println(
    69. " Es sollten "
    70. + hmcount
    71. + " sein, sind aber "
    72. + sl.count(s));
    73. return false;
    74. }
    75. }
    76. zugriff = ADSTool.stringRTime();
    77. // it = hm.keySet().iterator();
    78. // while (it.hasNext()) {
    79. // String s = (String) it.next();
    80. // //.remove(
    81. // if (sl.count(s) != 0) {
    82. // System.err.println("Fehler - Element " + s + " nicht gelöscht");
    83. // return false;
    84. // }
    85. // }
    86. // if (sl.noOccurences() != 0 || sl.noWords() != 0) {
    87. // System.err.println("Fehler - Searchliste nicht leer");
    88. // return false;
    89. // }
    90. loeschen = ADSTool.stringRTime();
    91. System.out.format(format, "Name", "Worte", "Versch", "Einfügen", "Iterieren", "Zugriff", "Löschen");
    92. System.out.format(format, name, anzahl, verschiedene, einfuegen, iterieren, zugriff, loeschen);
    93. return true;
    94. }
    95. /**
    96. * Ein HashMap die dasselbe macht wie SearchList
    97. * wird nur zum Testen gemacht, kommt später noch
    98. * als Thema - nicht daran aufhalten...
    99. * @param zeilen Strings zum Hinzufügen
    100. * @return Map der Häufigkeiten
    101. */
    102. static Map<String, Integer> makeMap(String[] zeilen) {
    103. Map<String, Integer> hm = new HashMap<String, Integer>();
    104. for (int j = 0; j < zeilen.length; j++) {
    105. String[] woerter = zeilen[j].split(splitregex);
    106. for (int k = 0; k < woerter.length; k++) {
    107. if (hm.containsKey(woerter[k])) {
    108. int count = hm.get(woerter[k]);
    109. hm.put(woerter[k], count + 1);
    110. } else {
    111. hm.put(woerter[k], 1);
    112. }
    113. }
    114. }
    115. return hm;
    116. }
    117. }
    Alles anzeigen