Html-Webpack-Plugin очень медленно работает с несколькими файлами мопса

Бинарный поиск диапазона для нижней границы и верхняя граница различны. Здесь разные способы имеют разные критерии остановки и шаг возврата.

  1. Для нижней границы (левый диапазон) вы можете вызвать следующую функцию, чтобы получить индекс в отсортированном массиве, где значение больше или равным ему, -1.
    int binarySearchForLeftRange(int a[], int length, int left_range)
    {
        if (a[length-1] < left_range)
            return -1;
    
        int low = 0;
        int high = length-1;
    
        while (low<=high)
        {
            int mid = low+((high-low)/2);
    
            if(a[mid] >= left_range)
                high = mid-1;
            else //if(a[mid]<i)
                low = mid+1;
        }
    
        return high+1;
    }
    
  2. Для верхней границы (правый диапазон) вы можете вызвать следующую функцию, чтобы получить индекс в отсортированном массиве, где значение меньше или равно ему -1 в противном случае.
    int binarySearchForRightRange(int a[], int length, int right_range)
    {
        if (a[0] > right_range)
            return -1;
    
        int low = 0;
        int high = length-1;
    
        while (low<=high)
        {
            int mid = low+((high-low)/2);
    
            if(a[mid] > right_range)
                high = mid-1;
            else //if(a[mid]<i)
                low = mid+1;
        }
    
        return low-1;
    }
    
  3. Наконец, если вы хотите получить количество элементов в этом диапазоне, это легко на основе возвращаемых значений этих двух вышеперечисленных функций.
    int index_left = binarySearchForLeftRange(a, length, left_range);
    int index_right = binarySearchForRightRange(a, length, right_range);
    
    if (index_left==-1 || index_right==-1 || index_left>index_right)
        count = 0;
    else
        count = index_right-index_left+1;
    

Тест: (с дубликатами)

    int a[] = {3,4,4,6,10,15,15,19,23,23,24,30};
    int length = sizeof(arr)/sizeof(arr[0]);

    int left_range = 4;
    int right_range = 23;
    int index_left = binarySearchForLeftRange(a, length, left_range); // will be 1
    int index_right = binarySearchForRightRange(a, length, right_range); // will be 9

    int count; // will be 9
    if (index_left==-1 || index_right==-1 || index_left>index_right)
        count = 0;
    else
        count = index_right-index_left+1;

EDIT: Конечно, вы можете объединить первые две функции в один пропуская один дополнительный флаг, чтобы указать его как нижнюю границу или верхнюю границу, хотя это будет гораздо более ясным, если нет. Ваш выбор!

0
задан Mirza Andriamanamisoa 17 January 2019 в 08:01
поделиться