Advertisement
Guest User

Untitled

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