Guest User

Untitled

a guest
May 21st, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.43 KB | None | 0 0
  1.   public unsafe class Element
  2.     {
  3.         public string subString;
  4.         public Element Back;
  5.         public Element[] Next = new Element[10];
  6.         public int status;  // 1 - prefix
  7.         public Element()
  8.         {
  9.            // Console.WriteLine("Wstawiono nowa tabele");
  10.         }
  11.     }
  12.  
  13.     class Program
  14.     {
  15.  
  16.  
  17.         public static object[] dane = new object[3];
  18.         public static object[] relacje = new object[2];
  19.         public static Element root;
  20.  
  21.         public static string FindPrefix(string pesel, string tmp)
  22.         {
  23.             string substring=null;
  24.  
  25.                  int len = 0;
  26.                     for (int i = 0; i < tmp.Length; i++)  // przeszukiwanie substringa
  27.                     {
  28.                         if (tmp[i] == pesel[i])
  29.                             len++;
  30.                         else break;
  31.                     }
  32.  
  33.                    
  34.                     for (int i = 0; i < len; i++)
  35.                     {
  36.                         substring = substring+ pesel[i];
  37.                     }
  38.             return substring;
  39.         }
  40.  
  41.         public static string CutPrefix(string tmp, int len)
  42.         {
  43.             string wynik = null;
  44.             for (int i = len; i < tmp.Length; i++)
  45.             {
  46.                 wynik += tmp[i];
  47.             }
  48.             return wynik;
  49.         }
  50.  
  51.         public static Element Find()
  52.         {
  53.             Element element = root;
  54.             while (element != null)
  55.             {
  56.                 Element element2 = element;
  57.                 for (int i = 0; i < 10; i++)
  58.                 {
  59.                     if (element2.Next[i] != null)
  60.                         Console.WriteLine(element2.Next[i].subString);
  61.  
  62.                 }
  63.                 element = element.Next[9];
  64.  
  65.             }
  66.             return element;
  67.  
  68.         }
  69.  
  70.         public static void View()
  71.         {
  72.             Element element = root;
  73.            
  74.             while (element != null)
  75.             {
  76.                
  77.                 Element element2 = element;
  78.                 for (int i = 0; i < 10; i++)
  79.                 {
  80.                     if (element2.Next[i] != null)
  81.                         Console.WriteLine(element2.Next[i].subString);
  82.  
  83.                 }
  84.  
  85.                 element = element.Next[9];
  86.                
  87.             }
  88.         }
  89.  
  90.  
  91.  
  92.  
  93.         public unsafe static void Collision(Element src, Element desc)
  94.         {
  95.               Console.WriteLine("Wykryto kolizje ");
  96.  
  97.               if (src.status == 1) // jesli to juz jest prefix
  98.               {
  99.                   string prefix = FindPrefix(desc.subString, src.subString);
  100. //-----------------------
  101.                     // jesli prefix jest krotszy od aktualnego = jest kolizja wyzej
  102.                   if (prefix.Length < src.subString.Length)
  103.                   {
  104.                       Element upper = new Element();  //1
  105.                       upper.subString = prefix;
  106.  
  107.                       //int ntx = int.Parse(tmp[0].ToString());
  108.                       src.Back = upper; //2  src.subString[0]
  109.  
  110.                       string tmp = CutPrefix(src.subString, prefix.Length); // 3
  111.                       src.subString = tmp;
  112.  
  113.                       int ntx = int.Parse(tmp[0].ToString()); //4
  114.                       upper.Next[ntx] = src;
  115.  
  116.                       AddToNode(upper, desc);
  117.  
  118.                   }
  119.                   //---------------------------
  120.                   else
  121.                   {
  122.                       desc.subString = CutPrefix(desc.subString, prefix.Length);
  123.                       AddToNode(src, desc);
  124.                   }
  125.               }
  126.               else // jak to normalny wezel
  127.               {
  128.  
  129.                   string prefix = FindPrefix(desc.subString, src.subString);
  130.                   // pierwszy element
  131.                   Element first = new Element();
  132.                   first.subString = CutPrefix(src.subString, prefix.Length);
  133.  
  134.                   AddToNode(src, first);
  135.  
  136.                   // drugi element
  137.                   Element second = new Element();
  138.                   second.subString = CutPrefix(desc.subString, prefix.Length);
  139.  
  140.                   AddToNode(src, second);
  141.  
  142.                   // podmiana wezla ojca
  143.                   src.subString = prefix;
  144.                   src.status = 1;
  145.               }  
  146.  
  147.         }
  148.  
  149.  
  150.         public unsafe static void AddToNode(Element src,Element desc)
  151.         {
  152.             int ntx = int.Parse(desc.subString[0].ToString()); // pobieram first character
  153.  
  154.             if (src.Next[ntx] == null)
  155.             {
  156.                 src.Next[ntx] = new Element();
  157.                 src.Next[ntx] = desc;
  158.                 desc.Back = &src;
  159.                 Console.WriteLine("Dodano: ojciec"+src.subString+" syn:"+desc.subString);
  160.             }
  161.             else //
  162.             {
  163.                 Collision(src.Next[ntx], desc);
  164.                // Console.WriteLine("Juz cos jest na pozycji");
  165.             }
  166.  
  167.         }
  168.  
  169.  
  170.  
  171.         public static void Add(string pesel)
  172.         {
  173.             int a = int.Parse(pesel[0].ToString()); // wyciagamy pierwsza liczbe i lecimy do tej komorki w tabeli
  174.             Element element = root;
  175.  
  176.  
  177.            
  178.             Element toSend = new Element();
  179.             toSend.subString = pesel;
  180.  
  181.  
  182.             while (element != null)
  183.             {
  184.                 if (element.Next[a] == null)  // jesli w danej komorce nic jeszcze nie ma
  185.                 {
  186.                     element.Next[a] = new Element();
  187.                     element.Next[a].subString = pesel;    // jesli jest wolny to wpisz pesel
  188.                     Console.WriteLine("Dodano pesel " + pesel);
  189.  
  190.                     Element element2 = element.Next[a];
  191.                     element2.Back = element;
  192.                     break;
  193.                 }
  194.                 else   // jesli nie jest nullem to wchodzimy
  195.                 {                
  196.                     while (element != null)
  197.                     {
  198.                         Element Back = element.Next[a];
  199.                         element = element.Next[a];
  200.  
  201.                         string SUB = FindPrefix(pesel, Back.subString); // sprawdzamy poprzedni z aktualnym
  202.                         string temp = CutPrefix(pesel, SUB.Length);
  203.                        
  204.                        int ntx = int.Parse(temp[0].ToString());
  205.  
  206.                        if (element.Next[ntx] == null)   // jesli syn ma w tym miejscu nulla
  207.                         {
  208.                             element.Next[ntx] = new Element();
  209.                             element.Next[ntx].subString = CutPrefix(pesel, SUB.Length);//pesel;
  210.  
  211.                             if (Back.subString.Length > SUB.Length) // zamiana roota
  212.                             {
  213.                                 Back.subString = SUB; // podmiana na krotszy
  214.                                 AddToNode(Back, toSend);
  215.                             }
  216.  
  217.                             if (Back.subString.Length != SUB.Length)
  218.                             {
  219.                                 temp = CutPrefix(Back.subString, SUB.Length);// Back.subString;
  220.                                 ntx = int.Parse(temp[0].ToString()); // wyciagamy pierwsza liczbe i lecimy do tej komorki w tabeli
  221.                                 element.Next[ntx] = new Element();
  222.                                 element.Next[ntx].subString = temp;
  223.  
  224.                                 Back.subString = SUB;
  225.                             }
  226.                             break;
  227.                         }
  228.  
  229.  
  230.                        if (element.Next[ntx] != null) // jesli ktos juz jest w tym miejscu
  231.                        {
  232.                            string old = element.Next[ntx].subString;
  233.                            string prefix = FindPrefix(pesel, old);
  234.  
  235.                            //update old(delete prefix)
  236.                            old = CutPrefix(old, prefix.Length);
  237.  
  238.                            element.Next[ntx].subString = prefix;
  239.  
  240.                            Element old_e = element.Next[ntx];
  241.                            element = element.Next[ntx];
  242.  
  243.                            element.Next[ntx] = new Element();
  244.                          
  245.  
  246.  
  247.                        }
  248.  
  249.                        
  250.                     }
  251.                     break;
  252.                 }
  253.             }
  254.  
  255.         }
  256.  
  257.  
  258.         static void Main(string[] args)
  259.         {
  260.             //drzewo PATRICIA
  261.             dane[0] = new string('a', 1);  // PESEL
  262.             dane[1] = new string('a', 1);   // IMIE
  263.             dane[2] = new string('a', 1);   //NAZWISKO
  264.  
  265.             relacje[0] = new string('a', 1);  // PESEL
  266.             relacje[1] = new string('a', 1);  // PESEL
  267.  
  268.  
  269.             //tworzymy liste (root) (1 poziom) (1 liczba z peselu) 0-9 = 10 miejsc w tablicy
  270.             //    PatriciaTree = new Osoba[10];
  271.             //PatriciaTree Tree = new PatriciaTree();
  272.  
  273.             //Tree.LoadDatabase();
  274.  
  275.             root = new Element(); // root
  276.             Console.WriteLine("Dodano root ");
  277.  
  278.  
  279.             Element element = new Element();
  280.             element.subString = "90111111111";
  281.             AddToNode(root, element);
  282.  
  283.             Element element2 = new Element();
  284.             element2.subString = "90122222222";
  285.             AddToNode(root, element2);
  286.  
  287.             Element element3 = new Element();
  288.             element3.subString = "91000022220";
  289.             AddToNode(root, element3);
  290.  
  291.             View();
  292.             Console.ReadKey();
  293.         }
  294.  
  295.  
  296.  
  297.  
  298.  
  299.     }
  300.  
  301. }
Add Comment
Please, Sign In to add comment