Advertisement
Narintep

Untitled

Mar 22nd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.46 KB | None | 0 0
  1.  
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.util.*;
  6. import java.util.List;
  7.  
  8. public class Main {
  9.  
  10.     public static void main(String[] args) throws FileNotFoundException {
  11.  
  12.             int input = 0,input2 = 0;
  13.             if (args.length == 0)
  14.                 input = 10;
  15.             else input = Integer.parseInt(args[0]);
  16.  
  17.             String Direct = System.getProperty("user.dir");
  18.             if (Direct.indexOf("src") == -1)
  19.                 Direct += "\\src";
  20.  
  21.  
  22.             Scanner file = new Scanner(new File("C:\\Users\\GL\\Desktop\\Algor\\HomeWork2\\product.txt"));
  23.             ArrayList<String> list = new ArrayList<>();
  24.             while (file.hasNextLine()) {
  25.                 list.add(file.nextLine());
  26.             }
  27.             file.close();
  28.  
  29.  
  30.  
  31.             Scanner key = new Scanner(System.in);
  32.             System.out.print("Product Search - Input your keyword (s): ");
  33.             String name = key.nextLine();
  34.  
  35.             String[] seg = name.split(" ");
  36.         long start1 = System.currentTimeMillis();
  37.         //while(name.length() > 0)
  38.       //  {
  39.          ArrayList<Database> Keep = new ArrayList<>();
  40.             for (int j = 0; j < list.size(); j++) {
  41.                 Database Store = new Database(list.get(j));
  42.                 ArrayList<Integer> Index = new ArrayList<Integer>();
  43.                 for (int k = 0; k < seg.length; k++) {
  44.                     if (findBoyerMoore(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()) != -1) {
  45.                         Index.add(findBoyerMoore(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()));
  46.                         if (Store.count==0) {
  47.                             Store.firstindex = findBoyerMoore(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray());
  48.                             Store.count++;
  49.                         }
  50.                     }
  51.                 }
  52.                 Integer min = Integer.MAX_VALUE;
  53.                 for (int l = 0; l < Index.size(); l++) {
  54.                     for (int m = l + 1; m < Index.size(); m++) {
  55.                         if (Math.abs((Index.get(l) - Index.get(m))) < min) {
  56.                             min = (Math.abs((Index.get(l) - Index.get(m))));
  57.                         }
  58.                     }
  59.                     Store.mDistance = min;
  60.                 }
  61.                 Keep.add(Store);
  62.                 // System.out.println(Store);
  63.             }
  64.             int note = 0;
  65.             List<Database> S = RadixSort(Keep);
  66.             int z=0;
  67.             while (z<S.size())
  68.             {
  69.                 if (S.get(z).firstindex > 1000)
  70.                 {
  71.                     z=0;
  72.  
  73.                     break;
  74.                 }
  75.                 note = z;
  76.                 z++;
  77.             } note++;
  78.  
  79.             if(note > input)
  80.             {
  81.                 note = input;
  82.             }
  83.             if (note ==  1)
  84.             {
  85.                 note=0;
  86.             }
  87.             for (int i = 0; i < note ; i++) {
  88.                     System.out.println(S.get(i).name);
  89.             }
  90.             System.out.println(note + " product(s) matched");
  91.             System.out.println();
  92.              key = new Scanner(System.in);
  93.  
  94.             /*System.out.print("Product Search - Input your keyword (s): ");
  95.              name = key.nextLine();
  96.              seg = name.split(" ");*/
  97.        // }
  98.         long end1 = System.currentTimeMillis();
  99.         System.out.println("BM_Time : "+ (end1-start1)+" (ms)");
  100.  
  101.         long start2 = System.currentTimeMillis();
  102.         ArrayList<Database> Keep2 = new ArrayList<>();
  103.         for (int j = 0; j < list.size(); j++) {
  104.             Database Store2 = new Database(list.get(j));
  105.             ArrayList<Integer> Index = new ArrayList<Integer>();
  106.             for (int k = 0; k < seg.length; k++) {
  107.                 if (findBrute(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()) != -1) {
  108.                     Index.add(findBrute(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()));
  109.                     if (Store2.count==0) {
  110.                         Store2.firstindex = findBrute(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray());
  111.                         Store2.count++;
  112.                     }
  113.                 }
  114.             }
  115.             Integer min = Integer.MAX_VALUE;
  116.             for (int l = 0; l < Index.size(); l++) {
  117.                 for (int m = l + 1; m < Index.size(); m++) {
  118.                     if (Math.abs((Index.get(l) - Index.get(m))) < min) {
  119.                         min = (Math.abs((Index.get(l) - Index.get(m))));
  120.                     }
  121.                 }
  122.                 Store2.mDistance = min;
  123.             }
  124.             Keep2.add(Store2);
  125.             // System.out.println(Store);
  126.         }
  127.         int note2 = 0;
  128.         List<Database> S2 = RadixSort(Keep2);
  129.         int z2=0;
  130.         while (z2<S2.size())
  131.         {
  132.             if (S2.get(z2).firstindex > 1000)
  133.             {
  134.                 z2=0;
  135.  
  136.                 break;
  137.             }
  138.             note2 = z2;
  139.             z2++;
  140.         } note2++;
  141.  
  142.         if(note2 > input)
  143.         {
  144.             note2 = input;
  145.         }
  146.         if (note2 ==  1)
  147.         {
  148.             note2=0;
  149.         }
  150.         long end2 = System.currentTimeMillis();
  151.         System.out.println("BF_Time : "+(end2-start2)+" (ms)");
  152.  
  153.  
  154.  
  155.         long start3 = System.currentTimeMillis();
  156.         ArrayList<Database> Keep3 = new ArrayList<>();
  157.         for (int j = 0; j < list.size(); j++) {
  158.             Database Store3 = new Database(list.get(j));
  159.             ArrayList<Integer> Index = new ArrayList<Integer>();
  160.             for (int k = 0; k < seg.length; k++) {
  161.                 if (findKMP(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()) != -1) {
  162.                     Index.add(findKMP(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray()));
  163.                     if (Store3.count==0) {
  164.                         Store3.firstindex = findKMP(list.get(j).toUpperCase().toCharArray(), seg[k].toUpperCase().toCharArray());
  165.                         Store3.count++;
  166.                     }
  167.                 }
  168.             }
  169.             Integer min = Integer.MAX_VALUE;
  170.             for (int l = 0; l < Index.size(); l++) {
  171.                 for (int m = l + 1; m < Index.size(); m++) {
  172.                     if (Math.abs((Index.get(l) - Index.get(m))) < min) {
  173.                         min = (Math.abs((Index.get(l) - Index.get(m))));
  174.                     }
  175.                 }
  176.                 Store3.mDistance = min;
  177.             }
  178.             Keep3.add(Store3);
  179.             // System.out.println(Store);
  180.         }
  181.         int note3 = 0;
  182.         List<Database> S3 = RadixSort(Keep2);
  183.         int z3=0;
  184.         while (z3<S3.size())
  185.         {
  186.             if (S3.get(z3).firstindex > 1000)
  187.             {
  188.                 z3=0;
  189.  
  190.                 break;
  191.             }
  192.             note3 = z3;
  193.             z3++;
  194.         } note3++;
  195.  
  196.         if(note3 > input)
  197.         {
  198.             note3 = input;
  199.         }
  200.         if (note3 ==  1)
  201.         {
  202.             note3=0;
  203.         }
  204.  
  205.  
  206.         long end3 = System.currentTimeMillis();
  207.         System.out.println("KMP_Time : "+(end3-start3)+" (ms)");
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.     }
  215.  
  216.     public static class Database {
  217.         String name;
  218.  
  219.         int firstindex, mDistance,  count;
  220.  
  221.         public Database(String name) {
  222.             this.name = name;
  223.             count = 0;
  224.             firstindex = Integer.MAX_VALUE;
  225.             mDistance = Integer.MAX_VALUE;
  226.         }
  227.  
  228.         @Override
  229.         public String toString() {
  230.             return name + " " + count + " " + firstindex + " " + mDistance;
  231.         }
  232.     }
  233.  
  234.     public static List<Database> RadixSort(ArrayList < Database > rData)
  235.     {
  236.         Integer max_count = 0, max_position = 0, max_minDist = 0;
  237.         for (int i = 0; i < rData.size(); i++) {
  238.             if (rData.get(i).count > max_count)
  239.                 max_count = rData.get(i).count;
  240.             if (rData.get(i).firstindex > max_position)
  241.                 max_position = rData.get(i).firstindex;
  242.             if (rData.get(i).mDistance > max_minDist)
  243.                 max_minDist = rData.get(i).mDistance;
  244.         }
  245.         int digit_count = 0, digit_position = 0, digit_dist = 0;
  246.         while (max_count > 0) {
  247.             max_count = max_count / 10;
  248.             digit_count++;
  249.         }
  250.         while (max_position > 0) {
  251.             max_position = max_position / 10;
  252.             digit_position++;
  253.         }
  254.         while (max_minDist > 0) {
  255.             max_minDist = max_minDist / 10;
  256.             digit_dist++;
  257.         }
  258.         LinkedList<Database> Bucket1 = new LinkedList<>();
  259.         for (int i = 0; i < rData.size(); i++)
  260.         {
  261.             Bucket1.add(rData.get(i));
  262.         }
  263.         int d = 1;
  264.         for (int i = 1; i <= digit_dist; i++) {
  265.             LinkedList<Database> tmp = new LinkedList<>();
  266.             for (int j = 0; j < 10; j++) {
  267.                 for (int k = 0; k < Bucket1.size(); k++) {
  268.                     if ((Bucket1.get(k).mDistance / d) % 10 == j)
  269.                         tmp.add(Bucket1.get(k));
  270.                 }
  271.             }
  272.             Bucket1 = new LinkedList<>();
  273.             for (int j = 0; j < tmp.size(); j++) {
  274.                 Bucket1.add(tmp.get(j));
  275.             }
  276.             d *= 10;
  277.         }
  278.         d = 1;
  279.         for (int i = 1; i <= digit_position; i++) {
  280.             LinkedList<Database> tmp = new LinkedList<>();
  281.             for (int j = 0; j < 10; j++) {
  282.                 for (int k = 0; k < Bucket1.size(); k++) {
  283.                     if ((Bucket1.get(k).firstindex / d) % 10 == j)
  284.                         tmp.add(Bucket1.get(k));
  285.                 }
  286.             }
  287.             Bucket1 = new LinkedList<>();
  288.             for (int j = 0; j < tmp.size(); j++) {
  289.                 Bucket1.add(tmp.get(j));
  290.             }
  291.             d *= 10;
  292.         }
  293.         d = 1;
  294.         for (int i = 1; i <= digit_count; i++) {
  295.             LinkedList<Database> tmp = new LinkedList<>();
  296.             for (int j = 9; j >= 0; j--) {
  297.                 for (int k = 0; k < Bucket1.size(); k++) {
  298.                     if ((Bucket1.get(k).count / d) % 10 == j)
  299.                         tmp.add(Bucket1.get(k));
  300.                 }
  301.             }
  302.             Bucket1 = new LinkedList<>();
  303.             for (int j = 0; j < tmp.size(); j++) {
  304.                 Bucket1.add(tmp.get(j));
  305.             }
  306.             d *= 10;
  307.         }
  308.         return Bucket1;
  309.     }
  310.     private static int[ ] computeFailKMP(char[ ] pattern) {  int m = pattern.length;
  311.          int[ ] fail = new int[m]; // by default, all overlaps are zero
  312.          int j = 1;
  313.          int k = 0;
  314.          while (j < m) { // compute fail[j] during this pass, if nonzero
  315.              if (pattern[j] == pattern[k]) { // k + 1 characters match thus far
  316.                 fail[j] = k + 1;
  317.                  j++;
  318.                  k++;
  319.                 } else if (k > 0) // k follows a matching prefix
  320.                  k = fail[k-1];
  321.              else // no match found starting at j
  322.              j++;
  323.             }  return fail;
  324.         }
  325.  
  326.     public static int findBrute(char[ ] text, char[ ] pattern) {  int n = text.length;
  327.          int m = pattern.length;
  328.          for (int i=0; i <= n - m; i++) { // try every starting index within text
  329.              int k = 0; // k is index into pattern
  330.              while (k < m && text[i+k] == pattern[k]) // kth character of pattern matches
  331.                  k++;
  332.             if (k == m) // if we reach the end of the pattern,
  333.                  return i; // substring text[i..i+m-1] is a match
  334.              }  return -1; // search failed
  335.          }
  336.  
  337.     public static int findKMP(char[ ] text, char[ ] pattern) {  int n = text.length;
  338.          int m = pattern.length;
  339.          if (m == 0) return 0; // trivial search for empty string
  340.          int[ ] fail = computeFailKMP(pattern); // computed by private utility
  341.          int j = 0; // index into text
  342.          int k = 0; // index into pattern
  343.          while (j < n) {  if (text[j] == pattern[k]) { // pattern[0..k] matched thus far
  344.              if (k == m - 1) return j - m + 1; // match is complete
  345.              j++; // otherwise, try to extend match
  346.              k++;
  347.              } else if (k > 0)
  348.              k = fail[k-1]; // reuse suffix of P[0..k-1]
  349.              else
  350.              j++;
  351.              }  return -1; // reached end without match
  352.          }
  353.  
  354.     public static int findBoyerMoore(char[] text, char[] pattern) {
  355.         int n = text.length;
  356.         int m = pattern.length;
  357.         if (m == 0) return 0;
  358.         Map<Character, Integer> last = new HashMap<>(); // the 'last' map
  359.         for (int i = 0; i < n; i++)
  360.             last.put(text[i], -1); // set −1 as default for all text characters
  361.         for (int k = 0; k < m; k++) {
  362.             last.put(pattern[k], k);
  363.         }
  364.         int i = m - 1;
  365.         int k = m - 1;
  366.         while (i < n) {
  367.             if (text[i] == pattern[k]) { // a matching character
  368.                 if (k == 0) return i; // entire pattern has been found
  369.                 i--; // otherwise, examine previous
  370.                 k--; // characters of text/pattern
  371.             } else {
  372.                 i += m - Math.min(k, 1 + last.get(text[i])); // case analysis for jump step
  373.                 k = m - 1;
  374.                 // restart at end of pattern
  375.             }
  376.         }
  377.         return -1;
  378.     }
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement