Ищу возможность
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млн например и список будет отсортированным.