jeudi 7 mai 2015

SubSquence

Hallo,

ich soll eine Methode implementieren, die die Teilfolge maximaler Summe anhand des folgenden Algorithmus berechnet:

Java Code:

  1.  
  2. /* Initialisierung */
  3. glob max <- 0
  4. suffix max <- 0
  5. l <- 1; r <- 0
  6. sl <- 1; m <- 0
  7. /* Ende der Initialisierung */
  8.  
  9. while m < n do
  10. m <- m + 1
  11. if a[m] + suffix max > glob max then
  12. suffix max am + suffix max
  13. glob max <- suffix max
  14. l <- sl; r <- m
  15. else if a[m] + suffix max >= 0 then
  16. suffix max <- a[m] + suffix max
  17. else
  18. suffix max <- 0
  19. sl <- m + 1
  20. endif
  21. endif
  22. endwhile

Die Folge ist F = {a[1], ... , a[n]}, a[1] != 0, n > 0
Nachbedingung: F(l,r) ist eine zusammenhängende Teilfolge maximaler Summe von F.

Gegeben ist folgende Java-Datei:
Java Code:

  1.  
  2. public class MaxSubSeq {
  3. public static final class SubSequence {
  4. // Anfangsindex der Teilfolge
  5. final int start;
  6. // Länge der Teilfolge
  7. final int length;
  8. // Summe der Teilfolge
  9. final int sum;
  10.  
  11. public SubSequence(int start, int length, int sum) {
  12. this.start = start;
  13. this.length = length;
  14. this.sum = sum;
  15. }
  16.  
  17. @Override public boolean equals(Object object) {
  18. if(!(object instanceof SubSequence))
  19. return false;
  20. SubSequence other = (SubSequence)object;
  21. return start == other.start
  22. && length == other.length
  23. && sum == other.sum;
  24. }
  25. };
  26.  
  27. static SubSequence optimalMaxSubSequence(int[] sequence) {
  28. // bitte implementieren Sie diese Methode!
  29. // geben Sie ein Objekt vom Typ SubSequence zurück,
  30. // das die maximale Teilfolge beschreibt.
  31. return new SubSequence(0, 0, 0);
  32. }
  33.  
  34. public static SubSequence naiveMaxSubSequence(int[] sequence) {
  35. int global_start = 0, global_length = 0, global_sum = 0;
  36.  
  37. for(int len = 1; len <= sequence.length; len++) {
  38. for(int i = 0; i < sequence.length - len + 1; i++) {
  39. int sum = 0;
  40. for(int j = 0; j < len; j++)
  41. sum += sequence[i + j];
  42.  
  43. if(sum > global_sum) {
  44. global_start = i;
  45. global_length = len;
  46. global_sum = sum;
  47. }
  48. }
  49. }
  50.  
  51. return new SubSequence(global_start, global_length, global_sum);
  52. }
  53.  
  54. public static void main(String[] args) {
  55. int seq_length = 10;
  56.  
  57. Random random = new Random();
  58.  
  59. int num_trails = 10;
  60. int range = 20;
  61.  
  62. for(int i = 0; i < num_trails; i++) {
  63. int[] sequence = new int[seq_length];
  64. for(int j = 0; j < seq_length; j++) {
  65. int abs = random.nextInt(range);
  66. sequence[j] = (random.nextBoolean() ? -abs : abs);
  67. }
  68.  
  69. System.out.println(Arrays.toString(sequence));
  70. SubSequence max = optimalMaxSubSequence(sequence);
  71. System.out.println(" optimalMaxSubSequence() returned (start: " + max.start + ", length: " + max.length
  72. + ", sum: " + max.sum + ")");
  73.  
  74. SubSequence correct = naiveMaxSubSequence(sequence);
  75. if(max.equals(correct)) {
  76. System.out.println(" Correct!");
  77. }else{
  78. System.out.println(" Error! (start: " + correct.start + ", length: " + correct.length
  79. + ", sum: " + correct.sum + ") is maximal!");
  80. }
  81. }
  82. }
  83. }


Die von mir bereits umgesetzt Methode sieht so aus:
Java Code:

  1.  
  2. static SubSequence optimalMaxSubSequence(int[] sequence) {
  3.  
  4. /* Initialisierung */
  5. int glob_max = 0;
  6. int suffix_max = 0;
  7. int l = 1, r = 0;
  8. int sl = 1, m = 0;
  9. /* Ende Intitalisierung */
  10.  
  11. while (m < sequence.length) {
  12. m += 1;
  13. for (int i = 0; i < sequence.length - 1; i++) {
  14. if(sequence[i] + suffix_max > glob_max){
  15. suffix_max += sequence[i];
  16. glob_max = suffix_max;
  17. l = sl;
  18. r = m;
  19. }
  20. else if(sequence[i] + suffix_max >= 0){
  21. suffix_max += sequence[i];
  22. }
  23. else{
  24. suffix_max = 0;
  25. sl = m+1;
  26. }
  27. }
  28. }
  29. return new SubSequence(0, 0, 0);
  30. }


Mein Problem
Ich weiß nicht, was ich in der Methode zurück geben soll. Den Pseudocode in Java zu verfassen war ja ziemlich einfach, aber ich verstehe nicht, was es mit dem Typ SubSequence auf sich hat. Ich vermute, dass an der Stelle
Java Code:

  1. return new SubSequence(0, 0, 0);
die Werte
Java Code:

  1. return new SubSequence(/*start, length, sum*/);
eingesetzt werden sollen. Wenn ich aber zum Beispiel
Java Code:

  1. return new SubSequence(l, r, glob_max);
einsetze, komme ich auf die falschen Ergebnisse.
Wie kann ich das umsetzen? Generell ist es das erste Mal, dass ich mit solchen selber erzeugten Datentypen arbeiten soll, deswegen fehlt mir auf jeden Fall Erfahrung damit.


SubSquence

0 commentaires:

Enregistrer un commentaire