我正在寻找一个大致对应于(用Java术语)Map<Set<int>, double>
的数据结构。基本上是一组标记的大理石,其中每组大理石与标量相关联。我希望它能够有效地处理以下操作:
在以下条件下:
我考虑过尝试,但我没有看到一个好方法来处理&#34;删除包含给定整数的每个集合&#34;操作
此数据结构的目的是表示离散随机变量,并允许对它们进行加法,乘法和标量乘法运算。这些离散随机变量中的每一个最终都是通过将这些操作应用于固定的(在编译时)一组独立的伯努利随机变量(即每个都以一定概率取值1或0)来创建的。
被建模的系统 close 可以表示为时间不均匀的马尔可夫链(当然会极大地简化这种情况)但不幸的是,跟踪各种转换后的持续时间至关重要。
答案 0 :(得分:1)
这是一个数据结构,可以非常有效地完成所有操作:
我将把它称为 BitmapArray 来解释这个问题。
考虑一下,显然对于你所描述的操作一个带有位图作为键和权重(你的双打)作为值的排序数组将非常有效。
位图是维护集合中成员资格的内容。由于您说集合中的整数范围在1-10,000之间,因此我们可以使用长度为10,000的位图来维护任何集合的信息。
对于一个数组来说很难排序,其中键可以大到2 ^ 10000,但你可以通过以下方式实现比较功能:
我知道这仍然是一个缓慢的比较。 但不要太慢,Here是我在长度为10000的位图上做的基准小提琴。 这是在Javascript中,如果您要用Java编写,它将会表现更好。
function runTest() {
var num = document.getElementById("txtValue").value;
num = isNaN(num * 1) ? 0 : num * 1;
/*For integers in the range 1-10,000 the worst case for comparison are any equal integers which will cause the comparision to iterate over the whole BitArray*/
bitmap1 = convertToBitmap(10000, num);
bitmap2 = convertToBitmap(10000, num);
before = new Date().getMilliseconds();
var result = firstIsGreater(bitmap1, bitmap2, 10000);
after = new Date().getMilliseconds();
alert(result + " in time: " + (after-before) + " ms");
}
function convertToBitmap(size, number) {
var bits = new Array();
var q = number;
do {
bits.push(q % 2);
q = Math.floor(q / 2);
} while (q > 0);
xbitArray = new Array();
for (var i = 0; i < size; i++) {
xbitArray.push(0);
}
var j = xbitArray.length - 1;
for (var i = bits.length - 1; i >= 0; i--) {
xbitArray[j] = bits[i];
j--
}
return xbitArray;
}
function firstIsGreater(bitArray1, bitArray2, lengthOfArrays) {
for (var i = 0; i < lengthOfArrays; i++) {
if (bitArray1[i] ^ bitArray2[i]) {
if (bitArray1[i]) return true;
else return false;
}
}
return false;
}
document.getElementById("btnTest").onclick = function (e) {
runTest();
};
另外,请记住,在构建BitmapArray时(或者在使用工会时),您只需执行一次操作,然后对于您最常执行的操作,它将变得非常高效:
注意:N是BitmapArray的长度。
为每个集合添加整数:最差/最佳情况O(N)时间。在每个位图中翻转0到1。
删除包含给定整数的每个集合:最差情况O(N)时间。
如果你只是将权重设置为0就可以了,那就更有效了。如果要删除给定集合中包含任何元素的所有集合,这也会非常容易。
两张地图联盟:最差情况O(N1 + N2)时间。就像合并两个已排序的数组一样,除了你必须再次明智地进行比较。
将所有双打乘以给定的双倍:最差/最佳情况O(N)时间。将每个值迭代并乘以输入double。
迭代BitmapArray :下一个元素的最差/最佳情况O(1)时间。