Ищу возможность

package folder1.myutil1;

/**
 * Created by Bahodir on 14.03.2020.
 */
public class IndexedTree {
    private boolean[] exist = null;
    private int[] count = null;
    private int size = 0;
    private int allSize = 0;

    public IndexedTree(int size) {
        if (size < 0) return;
        allSize = size;
        exist = new boolean[size];
        count = new int[size];
    }

    public void add(int key) {
        if (key < 0 || key >= allSize || exist[key]) return;
        size++;
        int low = 0;
        int high = allSize - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;
            count[mid]++;
            if (mid < key)
                low = mid + 1;
            else if (mid > key)
                high = mid - 1;
            else {
                exist[mid] = true;
                return;
//                return mid; // key found
            }
        }
//        return -(low + 1);  // key not found.
    }

    public int count() {
        if (exist == null || exist.length < 0) return 0;
        int mid = (allSize - 1) >>> 1;
        return count[mid];
    }

    public Integer getByIndex(int index) {
        if (index < 0 || index >= size) return null;
        int c = index + 1;
        int low = 0;
        int high = allSize - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;
            int leftCount = low <= mid - 1 ? count[(low + mid - 1) >>> 1] : 0;
            if (leftCount >= c) {
                high = mid - 1;
            } else {
                c -= leftCount;
                if (!exist[mid]) {
                    low = mid + 1;
                } else if (c == 1) {
                    return mid;
                } else {
                    c--;
                    low = mid + 1;
                }
            }
        }
        return null;
    }

    public int size() {
        return size;
    }

    public void remove(int key) {
        if (key < 0 || key >= allSize || !exist[key]) return;
        size--;
        int low = 0;
        int high = allSize - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;
            count[mid]--;
            if (mid < key)
                low = mid + 1;
            else if (mid > key)
                high = mid - 1;
            else {
                exist[mid] = false;
                return;
            }
        }
    }
}

Вот пример использования этого класса

import folder1.myutil1.IndexedTree;

public class Main1 {

    public static void main(String[] args) throws Exception {
        IndexedTree tree = new IndexedTree(100);
        tree.add(95);
        tree.add(30);
        tree.add(44);
        tree.add(99);
        tree.add(1);
        for(int i = 0; i < tree.size(); i++) {
            System.out.println(tree.getByIndex(i));
        }
        System.out.println("После удаления");
        tree.remove(44);
        for(int i = 0; i < tree.size(); i++) {
            System.out.println(tree.getByIndex(i));
        }
    }
}

Вот результат

1
30
44
95
99
После удаления
1
30
95
99

Этот класс я придумал для своего одного проекта, кто понял как работает это класс, скажите кто до меня изобрёл такой подход.

ВОПРОС ВТОРОЙ И ОСНОВНОЙ. Я хочу создать несколько сортированных списков в одном фиксированном месте на памяти компьютера. Я знаю как реализовать используя алгоритмы для сбалансирования дерева. Код который приведен вверху IndexedTree разработанной мной, в этом классе не используется алгоритмы для сбалансирования дерева. Но с помощью такого подхода можно создать только один список, а мне нужно много списков.

Повторяю если вы не сможете мне помочь, я этого могу добиться используя алгоритмы для сбалансирования дерева, и этот подход тоже будет оригинальным и будет работать быстро. Просто решился задать вопрос, а может существует более простой подход, учитывая что значения в списке будет только цифры от 0 до 20млн например и список будет отсортированным.


Ответы (0 шт):