Advertisement
THOMAS_SHELBY_18

lesson 4

Apr 4th, 2024
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.41 KB | Source Code | 0 0
  1. package by.it.group351004.narivonchik.lesson04;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.InputStream;
  6. import java.util.Scanner;
  7.  
  8. /*
  9. В первой строке источника данных даны:
  10.         - целое число 1<=n<=100000 (размер массива)
  11.         - сам массив A[1...n] из n различных натуральных чисел,
  12.           не превышающих 10E9, в порядке возрастания,
  13. Во второй строке
  14.         - целое число 1<=k<=10000 (сколько чисел нужно найти)
  15.         - k натуральных чисел b1,...,bk не превышающих 10E9 (сами числа)
  16. Для каждого i от 1 до kk необходимо вывести индекс 1<=j<=n,
  17. для которого A[j]=bi, или -1, если такого j нет.
  18.  
  19.         Sample Input:
  20.         5 1 5 8 12 13
  21.         5 8 1 23 1 11
  22.  
  23.         Sample Output:
  24.         3 1 -1 1 -1
  25.  
  26. (!) Обратите внимание на смещение начала индекса массивов JAVA относительно условий задачи
  27. */
  28.  
  29. public class A_BinaryFind {
  30.     int[] findIndex(InputStream stream) throws FileNotFoundException {
  31.         //подготовка к чтению данных
  32.         Scanner scanner = new Scanner(stream);
  33.         //!!!!!!!!!!!!!!!!!!!!!!!!!     НАЧАЛО ЗАДАЧИ     !!!!!!!!!!!!!!!!!!!!!!!!!
  34.  
  35.         //размер отсортированного массива
  36.         int n = scanner.nextInt();
  37.         //сам отсортированный массива
  38.         int[] a=new int[n];
  39.         for (int i = 1; i <= n; i++) {
  40.             a[i-1] = scanner.nextInt();
  41.         }
  42.         //размер массива индексов
  43.         int k = scanner.nextInt();
  44.         int[] result=new int[k];
  45.         nextValue:
  46.         for (int i = 0; i < k; i++) {
  47.             int value = scanner.nextInt();
  48.  
  49.             int left = 0;
  50.             int right = a.length - 1;
  51.             int mid;
  52.             while (left <= right) {
  53.                 mid = (left + right) / 2;
  54.                 if (a[mid] == value) {
  55.                     result[i] = mid + 1;
  56.                     continue nextValue;
  57.                 } else if (a[mid] < value) {
  58.                     left = mid + 1;
  59.                 } else {
  60.                     right = mid - 1;
  61.                 }
  62.             }
  63.             result[i] = -1;
  64.         }
  65.         //!!!!!!!!!!!!!!!!!!!!!!!!!     КОНЕЦ ЗАДАЧИ     !!!!!!!!!!!!!!!!!!!!!!!!!
  66.         return result;
  67.     }
  68.     public static void main(String[] args) throws FileNotFoundException {
  69.         String root = System.getProperty("user.dir") + "/src/";
  70.         InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataA.txt");
  71.         A_BinaryFind instance = new A_BinaryFind();
  72.         //long startTime = System.currentTimeMillis();
  73.         int[] result=instance.findIndex(stream);
  74.         //long finishTime = System.currentTimeMillis();
  75.         for (int index:result){
  76.             System.out.print(index+" ");
  77.         }
  78.     }
  79.  
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93. package by.it.group351004.narivonchik.lesson04;
  94.  
  95. import java.io.FileInputStream;
  96. import java.io.FileNotFoundException;
  97. import java.io.InputStream;
  98. import java.util.Arrays;
  99. import java.util.Scanner;
  100.  
  101. /*
  102. Реализуйте сортировку слиянием для одномерного массива.
  103. Сложность алгоритма должна быть не хуже, чем O(n log n)
  104.  
  105. Первая строка содержит число 1<=n<=10000,
  106. вторая - массив A[1…n], содержащий натуральные числа, не превосходящие 10E9.
  107. Необходимо отсортировать полученный массив.
  108.  
  109. Sample Input:
  110. 5
  111. 2 3 9 2 9
  112. Sample Output:
  113. 2 2 3 9 9
  114. */
  115. public class B_MergeSort {
  116.  
  117.     int[] getMergeSort(InputStream stream) throws FileNotFoundException {
  118.         //подготовка к чтению данных
  119.         Scanner scanner = new Scanner(stream);
  120.         //!!!!!!!!!!!!!!!!!!!!!!!!!     НАЧАЛО ЗАДАЧИ     !!!!!!!!!!!!!!!!!!!!!!!!!
  121.         //размер массива
  122.         //размер массива
  123.         int n = scanner.nextInt();
  124.         //сам массив
  125.         int[] a = new int[n];
  126.         for (int i = 0; i < n; i++) {
  127.             a[i] = scanner.nextInt();
  128.         }
  129.         long startTime = System.currentTimeMillis();
  130.         mergeSortCall(a);
  131.         long finishTime = System.currentTimeMillis();
  132.         System.out.println(finishTime - startTime);
  133.         //!!!!!!!!!!!!!!!!!!!!!!!!!     КОНЕЦ ЗАДАЧИ     !!!!!!!!!!!!!!!!!!!!!!!!!
  134.         return a;
  135.     }
  136.     public static void mergeSortCall(int[] arr) {
  137.         int[] supArr = Arrays.copyOf(arr, arr.length);
  138.         int left = 0;
  139.         int right = arr.length - 1;
  140.         mergeSort(arr, supArr, left, right);
  141.     }
  142.     public static void mergeSort(int[] arr, int[] supArr, int left, int right) {
  143.         if (left >= right) {
  144.             return;
  145.         }
  146.         int mid = left + (right - left) / 2;
  147.         mergeSort(arr, supArr, left, mid);
  148.         mergeSort(arr, supArr, mid + 1, right);
  149.         merge(arr, supArr, left, mid, mid + 1, right);
  150.     }
  151.     public static void merge(int[] arr, int[] supArr, int left1, int right1, int left2, int right2) {
  152.         System.arraycopy(arr, left1, supArr, left1, right2 + 1 - left1);
  153.         int l = left1;
  154.         int r = left2;
  155.         for (int i = left1; i <= right2; i++) {
  156.             if (l > right1) {
  157.                 arr[i] = supArr[r];
  158.                 r += 1;
  159.             } else if (r > right2) {
  160.                 arr[i] = supArr[l];
  161.                 l += 1;
  162.             } else if (supArr[l] < supArr[r]) {
  163.                 arr[i] = supArr[l];
  164.                 l += 1;
  165.             } else {
  166.                 arr[i] = supArr[r];
  167.                 r += 1;
  168.             }
  169.         }
  170.     }
  171.     public static void main(String[] args) throws FileNotFoundException {
  172.         String root = System.getProperty("user.dir") + "/src/";
  173.         InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataB.txt");
  174.         B_MergeSort instance = new B_MergeSort();
  175.         //long startTime = System.currentTimeMillis();
  176.         int[] result=instance.getMergeSort(stream);
  177.         //long finishTime = System.currentTimeMillis();
  178.         for (int index:result){
  179.             System.out.print(index+" ");
  180.         }
  181.     }
  182. }
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192. package by.it.group351004.narivonchik.lesson04;
  193.  
  194. import java.io.FileInputStream;
  195. import java.io.FileNotFoundException;
  196. import java.io.InputStream;
  197. import java.util.Arrays;
  198. import java.util.Scanner;
  199.  
  200. /*
  201. Рассчитать число инверсий одномерного массива.
  202. Сложность алгоритма должна быть не хуже, чем O(n log n)
  203.  
  204. Первая строка содержит число 1<=n<=10000,
  205. вторая - массив A[1…n], содержащий натуральные числа, не превосходящие 10E9.
  206. Необходимо посчитать число пар индексов 1<=i<j<n, для которых A[i]>A[j].
  207.  
  208.     (Такая пара элементов называется инверсией массива.
  209.     Количество инверсий в массиве является в некотором смысле
  210.     его мерой неупорядоченности: например, в упорядоченном по неубыванию
  211.     массиве инверсий нет вообще, а в массиве, упорядоченном по убыванию,
  212.     инверсию образуют каждые (т.е. любые) два элемента.
  213.     )
  214.  
  215. Sample Input:
  216. 5
  217. 2 3 9 2 9
  218. Sample Output:
  219. 2
  220.  
  221. Головоломка (т.е. не обязательно).
  222. Попробуйте обеспечить скорость лучше, чем O(n log n) за счет многопоточности.
  223. Докажите рост производительности замерами времени.
  224. Большой тестовый массив можно прочитать свой или сгенерировать его программно.
  225. */
  226. public class C_GetInversions {
  227.  
  228.     int calc(InputStream stream) {
  229.         //подготовка к чтению данных
  230.         Scanner scanner = new Scanner(stream);
  231.         //размер массива
  232.         int n = scanner.nextInt();
  233.         //сам массив
  234.         int[] a = new int[n];
  235.         for (int i = 0; i < n; i++) {
  236.             a[i] = scanner.nextInt();
  237.         }
  238.         return getInversionsOptimal(a);
  239.     }
  240.  
  241.     public static int getInversionsOptimal(int[] arr) {
  242.         return mergeSortAndCount(arr, 0, arr.length - 1);
  243.     }
  244.  
  245.     public static int mergeSortAndCount(int[] arr, int l, int r) {
  246.         int count = 0;
  247.         if (l < r) {
  248.             int m = (l + r) / 2;
  249.             count += mergeSortAndCount(arr, l, m);
  250.             count += mergeSortAndCount(arr, m + 1, r);
  251.             count += mergeAndCount(arr, l, m, r);
  252.         }
  253.         return count;
  254.     }
  255.  
  256.     static int mergeAndCount(int[] arr, int l,
  257.                              int m, int r) {
  258.         int[] left = Arrays.copyOfRange(arr, l, m + 1);
  259.         int[] right = Arrays.copyOfRange(arr, m + 1, r + 1);
  260.         int i = 0, j = 0, k = l, swaps = 0;
  261.         while (i < left.length && j < right.length) {
  262.             if (left[i] <= right[j])
  263.                 arr[k++] = left[i++];
  264.             else {
  265.                 arr[k++] = right[j++];
  266.                 swaps += (m + 1) - (l + i);
  267.             }
  268.         }
  269.         while (i < left.length)
  270.             arr[k++] = left[i++];
  271.         while (j < right.length)
  272.             arr[k++] = right[j++];
  273.         return swaps;
  274.     }
  275.  
  276.     public static void main(String[] args) throws FileNotFoundException {
  277.         String root = System.getProperty("user.dir") + "/src/";
  278.         InputStream stream = new FileInputStream(root + "by/it/a_khmelev/lesson04/dataC.txt");
  279.         C_GetInversions instance = new C_GetInversions();
  280.         //long startTime = System.currentTimeMillis();
  281.         int result = instance.calc(stream);
  282.         //long finishTime = System.currentTimeMillis();
  283.         System.out.print(result);
  284.     }
  285. }
  286.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement