![](/img/trans.png)
[英]Data structure to select number with probability proportional to its value in less than O(n)
[英]Get the smallest difference between elements in a data structure in less than O(n) time
假設我在數據結構中有一些整數。 當我在數據結構中插入新數字時,我希望獲得新插入的元素與數據結構中已有的任何其他元素之間的最小差異。 我應該使用什么數據結構和算法? AO(n)解決方案很簡單,我想要更好。 謝謝。
一種選擇是使用TreeSet
(基於TreeMap
),這將需要幾個O(lg n)
操作。 該類提供了兩種方法,可用於找到最接近您要插入的值的元素:
公共E上限(E e)
返回此集合中大於或等於給定元素的最小元素;如果沒有此類元素,則返回null。公共E樓(E e)
返回此集合中小於或等於給定元素的最大元素;如果沒有此類元素,則返回null。
public static int findClosest(TreeSet set, Integer val) {
if (set == null || set.size() == 0) {
return -1;
}
// ceiling == 9 for input of 7
// O(lg n) operation
Integer ceiling = (Integer)set.ceiling(val);
// floor = 6 for input of 7
// O(lg n) operation
Integer floor = (Integer)set.floor(val);
if (ceiling == null) {
return val - floor;
}
if (floor == null) {
return ceiling - val;
}
return (val - floor > ceiling - val) ? ceiling - val : val - floor;
}
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(5);
ts.add(1);
ts.add(6);
ts.add(9);
ts.add(2);
ts.add(3);
int diff = findClosest(ts, 7);
// closest is 6, so diff == 1
}
您可以使用高度平衡的二進制搜索樹 。 這些可以用許多數據結構之一來實現。 插入通常平均為O(log(n)),查找一個或兩個最接近的整數(在插入值的任一側)也最多為O(log(n))。
可能還有其他數據結構可以做得更好(特別是如果您可以合理地綁定需要處理的整數值),但是我想不到一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.