Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.54 KB | None | 0 0
  1.  
  2. import org.apache.commons.codec.digest.DigestUtils;
  3. import java.math.BigInteger;
  4. import java.util.*;
  5.  
  6. public class SimHashBuckets {
  7.     public static void main(String[] args) {
  8.         Scanner scanner = new Scanner(System.in);
  9.         int N = scanner.nextInt();
  10.         scanner.nextLine();
  11.  
  12.         List<String> texts = new ArrayList<String>(N);
  13.         for (int i = 0; i < N; i++) {
  14.             texts.add(simhash(scanner.nextLine()));
  15.         }
  16.  
  17.         Map<Integer, Set<Integer>> kandidati = new HashMap<Integer, Set<Integer>>();
  18.         kandidati = lsh(kandidati, N, texts);
  19. //        System.out.println(kandidati);
  20.  
  21.  
  22.         int Q = scanner.nextInt();
  23.         System.out.println("nextLine " +  scanner.nextLine());
  24.         String query;
  25.         for (int i = 0; i <= Q; i++) {
  26.             query = scanner.nextLine();
  27.             int first = Integer.parseInt(query.split(" ")[0]);
  28.             int second = Integer.parseInt(query.split(" ")[1]);
  29.             Set<Integer> similar = kandidati.get(first);
  30.             String t = texts.get(first);
  31.             int slicniTekstovi = 0;
  32.  
  33.             if (similar != null) {
  34.                 for (Integer sim : similar) {
  35.                     if (sim != first) {
  36.                         String usporediS = texts.get(sim);
  37.                         int slicni = 0;
  38.  
  39.                         for (int bit = 0; bit < usporediS.length(); bit++) {
  40.                             if (t.charAt(bit) != usporediS.charAt(bit)) {
  41.                                 slicni++;
  42.                             }
  43.                         }
  44.  
  45.                         if (slicni <= second) {
  46.                             slicniTekstovi++;
  47.                         }
  48.                     }
  49.                 }
  50.             }
  51.             System.out.println(slicniTekstovi);
  52.         }
  53.     }
  54.  
  55.     private static Map<Integer, Set<Integer>> lsh(Map<Integer, Set<Integer>> kandidati, int n, List<String> texts) {
  56.         for (int pojas = 1; pojas <= 8; pojas++) {
  57.             Map<Integer, Set<Integer>> pretinci = new HashMap<Integer, Set<Integer>>();
  58.  
  59.             for (int trenutni_dokument = 0; trenutni_dokument < n; trenutni_dokument++) {
  60.                 String hash = texts.get(trenutni_dokument);
  61. //                System.out.println(hash);
  62.                 int val = hashToInt(pojas, hash);
  63. //                System.out.println(val);
  64.                 Set<Integer> tekstovi = new HashSet<Integer>();
  65.  
  66.                 if (pretinci.containsKey(val)) {
  67.                     tekstovi = pretinci.get(val);
  68.  
  69.                     for (Integer text_id : tekstovi) {
  70.                         if (!kandidati.containsKey(trenutni_dokument)) {
  71.                             Set<Integer> set = new HashSet<Integer>();
  72.                             kandidati.put(trenutni_dokument, set);
  73.                         }
  74.  
  75.                         if (!kandidati.containsKey(text_id)) {
  76.                             Set<Integer> set = new HashSet<Integer>();
  77.                             kandidati.put(text_id, set);
  78.                         }
  79.  
  80.                         kandidati.get(trenutni_dokument).add(text_id);
  81.                         kandidati.get(text_id).add(trenutni_dokument);
  82.  
  83. //                        if (kandidati.containsKey(trenutni_dokument) && kandidati.containsKey(text_id)) {
  84. //                            kandidati.get(trenutni_dokument).add(text_id);
  85. //                            kandidati.get(text_id).add(trenutni_dokument);
  86. //                        } else {
  87. //                            Set<Integer> set = new HashSet<Integer>();
  88. //                            set.add(text_id);
  89. //                            kandidati.put(trenutni_dokument, set);
  90. //                            set.remove(text_id);
  91. //                            set.add(trenutni_dokument);
  92. //                            kandidati.put(text_id, set);
  93. //                        }
  94.                     }
  95.                 }
  96.  
  97.                 tekstovi.add(trenutni_dokument);
  98.                 pretinci.put(val, tekstovi);
  99. //                System.out.println(pretinci);
  100. //                System.out.println(kandidati);
  101.             }
  102.  
  103.         }
  104.         return kandidati;
  105.     }
  106.  
  107.     private static int hashToInt(int pojas, String hash) {
  108.         String bits = "";
  109.         bits = hash.substring((pojas - 1) * 16, pojas * 16);
  110.         return Integer.parseInt(bits, 2);
  111.     }
  112.  
  113.     private static String simhash(String text) {
  114.         String[] jedinke = text.split(" ");
  115.         int[] sh = new int[128];
  116.  
  117.         for (String j : jedinke) {
  118.             byte[] digest = DigestUtils.md5(j);
  119.             BigInteger biStr = new BigInteger(digest);
  120. //            String s = biStr.toString(2);
  121.  
  122.             if (biStr.compareTo(BigInteger.ZERO) < 0) {
  123.                 biStr = new BigInteger(1, digest);
  124.             }
  125.  
  126.             String s = biStr.toString(2);
  127.             s = String.format("%128s", s).replace(' ', '0');
  128.  
  129.  
  130. //            System.out.println(s);
  131.  
  132.             for (int bit = 0; bit < s.length(); bit++) {
  133.                 if (s.charAt(bit) == '1') {
  134.                     sh[bit] += 1;
  135.                 } else {
  136.                     sh[bit] -= 1;
  137.                 }
  138.             }
  139.         }
  140.  
  141.         for (int bit = 0; bit < sh.length; bit++) {
  142.             if (sh[bit] >= 0)
  143.                 sh[bit] = 1;
  144.             else
  145.                 sh[bit] = 0;
  146.         }
  147.  
  148.         StringBuffer sb = new StringBuffer();
  149.         for (int i = 0; i < sh.length; i++) {
  150.             sb.append(sh[i]);
  151.         }
  152.  
  153. //        System.out.println(sb.toString());
  154.  
  155.         return sb.toString();
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement