Advertisement
Guest User

Untitled

a guest
Oct 1st, 2014
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.74 KB | None | 0 0
  1. // Notkun:  b = isInPowerArray(x,i,y);
  2. // Fyrir:   x er strengur sem inniheldur aðeins stafina
  3. //          a,b,...,z (enska stafrófið).  Enginn
  4. //          stafur er endurtekinn í strengnum og
  5. //          stafirnir eru í stafrófsröð.  Lengd
  6. //          strengsins er því á bilinu 0..26.
  7. //          i er hvaða heiltala sem er, y er strengur.
  8. // Eftir:   b er satt þá og því aðeins að veldisfylki
  9. //          strengsins x hafi strenginn y í sæti i.
  10.  
  11.  
  12. static public boolean isInPowerArray( String x, int i, String y )
  13. {
  14.     // skilyrði er að 0<=i
  15.     if ((i<0) )  
  16.     {
  17.         return false;
  18.     }
  19.    
  20.    
  21.     // Það eru vandamál með að x.charAt(0) fyrir núllstrenginn svo við meðhöndlum hann sérstaklega.
  22.     if (y == "")
  23.     {
  24.         // Núllstrengurinn er alltaf í núllta sæti.
  25.         if (i == 0)
  26.         {
  27.         return true;
  28.         }
  29.         return false;
  30.     }
  31.    
  32.  
  33.  
  34.     // ATH!  a == b gáir hvort a og b séu sami hluturinn,   a.equals(b) gáir hvort a og b hafi sama gildi
  35.    
  36.     // það vantar núllstrenginn í Power(x), það byrjar á "a" svo indexið hliðrast um 1
  37.     if (Power(x)[i-1].equals(y))
  38.     {
  39.         return true;
  40.     }
  41.    
  42.     // else
  43.     return false ;
  44.    
  45.    
  46.  
  47.    
  48.    
  49. }
  50.  
  51.  
  52. // Notkun: a = Power(x);
  53. // Fyrir:  x er strengur sem inniheldur stafi
  54. //         a..z í stafrófsröð, núll eða fleiri.
  55. //         Hver stafur má í mesta lagi koma fyrir
  56. //         einu sinni.
  57. // Eftir:  a vísar á veldisfylki strengsins x, að núllstrengnum undanskildnum. length.a == 2^(x.length())-1
  58.  
  59.  
  60.  
  61. // Fallið er endurkvæmt og byggir á eftirfarandi staðreynd:
  62. // Veldisfylki x = fylkið sem inniheldur fremsta staf x bætt við sérhvert stak í veldisfylki x.substring(0,1) auk veldisfylkis x.substring(0,1)
  63. // t.d. er  P(c) = {"", "c"}
  64. //          P(bc) = {bc, b} auk {"", "c"}
  65. //          P(abc) = {a, ab, ac, abc} auk {b, bc, c, ""}
  66. // Það er skemmtilegt við þessa aðferð er að stökin koma út í stafrófsröð.
  67.  
  68. static public String[] Power( String x )
  69. {
  70.     // Hvað gerist ræðst alfarið af því hversu langur strengurinn x er
  71.     int k = x.length();
  72.     // Grunnur. Fallið verður að taka eitthvað grunngildi. dæmi: Power(abc) kallar á Power(bc) sem loks kallar á Power(c) sem skilar {c}
  73.     // Ath. það er ekki það sama og veldisfylki "c" því tómi strengurinn er ekki með í úttakinu. En það er ekki vandamál.
  74.     if (k == 1)
  75.     {
  76.         String[] res1 = {x};
  77.         return res1;
  78.         }
  79.    
  80.    
  81.    
  82.     int m = (int)Math.pow(2,k) ;  // fjöldi staka í veldisfylkinu P(x)
  83.     int s = (int)Math.pow(2,k-1); // fjöldi staka í P(x.substring(1))
  84.     String[] res = new String[m-1]; // hlöðum gildunum inn í 2^k-1 staka fylki sem verður úttakið (result)
  85.     String x0 = Character.toString(x.charAt(0)); // Fremsti stafurinn í x, sem þarf að vinna sérstaklega með. ath. Munur er á staf og strengnum sem inniheldur stafinn
  86.     String[] substr = Power(x.substring(1));  // köllum á fallið fyrir substrenginn bara einu sinni.  Ef þetta er gert inni í lykkjunum kemur timeout!
  87.    
  88.    
  89.     res[0] = x0;  // Þar sem við vinnum ekki með tóma strenginn þarf að setja fremsta stafinn inn í fylkið í hverju skrefi.
  90.                   // Til að finna veldisfylkið viljum við skeyta x0 við öll stök veldisfylkis x.substring(1), en Power(x) inniheldur aldrei tóma strenginn.
  91.                   // Dæmi: P(bc) inniheldur b því "b" + "" == "b"
  92.    
  93.  
  94.     // Það eru 2^k = 2^(k-1)+2^(k-1) stök í veldisfylkinu.
  95.     // Helmingur stakanna í veldisfylkinu P(x) eru fremsti stafurinn í x skeyttur saman við sérhvert stak P(x.substring(1))
  96.     // 1 <= i < 2^(k-1)
  97.     for(int i = 1; i < s;  i++)
  98.     { // Fastayrðing lykkju:  res[i-1] er i-ta stak (talið frá 0) veldisfylkisins P(x).
  99.      
  100.       // ath. fastayrðingin segir til um ástandið eftir að i hefur fengið  gildi fyrir umferðina en áður en nokkuð gerist
  101.      
  102.       // dæmi: x = "abc", i = 3,  res[i-1] = "abc"
  103.       // P(x) = {"", "a", "ab", "abc", "ac, "b", "bc", "c"}     P(x.substring(1)) = {"", "b", "bc", "c"}
  104.       // i = 1,  res[i-1] = "a"
  105.    
  106.         res[i] = x0 + substr[i-1];  // Byrjum á 0. staki substrengsins
  107.    
  108.     }
  109.    
  110.    
  111.     // Hinn helmingurinn eru stökin úr P(x.substring(1))
  112.     // 2^(k-1) <= j < 2^k
  113.     for(int j = s; j< m-1 ; j++)
  114.     { // Fastayrðing lykkju: res[j-1] er j-ta stak P(x).
  115.      
  116.       // dæmi: x = "abc", j = 4,  res[j-1] = "ac"
  117.       // P(x) = {"", "a", "ab", "abc", "ac, "b", "bc", "c"}     P(x.substring(1)) = {"", "b", "bc", "c"}
  118.       // j = 6, res[j-1] = b
  119.         res[j] = substr[ j-s ]; // Byrjum á 0. staki substrengsins
  120.    
  121.     }
  122.  
  123.    
  124.     return res;
  125.  
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement