Javascript 理解crossfilter.js位旋转黑客
我在crossfilter.js上找到了它,我正试图理解这句话的意思 交叉过滤器使用排序索引(和一些旋转技巧)来 使之成为可能,显著提高live的性能 直方图和top-K列表 我认为,排序索引指的是在数据库中使用索引。避免进行全表扫描。每个维度都有一个索引,在该索引上进行过滤。这将导致增量筛选(逐个筛选每个索引),最后在最终生成筛选数据时触发事件Javascript 理解crossfilter.js位旋转黑客,javascript,bit-manipulation,crossfilter,Javascript,Bit Manipulation,Crossfilter,我在crossfilter.js上找到了它,我正试图理解这句话的意思 交叉过滤器使用排序索引(和一些旋转技巧)来 使之成为可能,显著提高live的性能 直方图和top-K列表 我认为,排序索引指的是在数据库中使用索引。避免进行全表扫描。每个维度都有一个索引,在该索引上进行过滤。这将导致增量筛选(逐个筛选每个索引),最后在最终生成筛选数据时触发事件 但是看着这些图片,我无法理解黑客是什么,它的用途是什么,以及如何使用。有人能解释一下玩比特游戏的目的吗?开头有这样一个声明: m=0,//表示正在使用
但是看着这些图片,我无法理解黑客是什么,它的用途是什么,以及如何使用。有人能解释一下玩比特游戏的目的吗?开头有这样一个声明:
m=0,//表示正在使用哪些维度的位掩码
“位掩码”是跟踪真/假选项列表的简单而有效的方法。假设您创建了一个待售汽车列表,并希望为列出的每辆汽车设置四个额外参数:4x4、ABS、ESP、climatronic。您可以这样定义汽车对象:
MyCar = { brand : "Mercedes",
extras : {
"4x4" : false,
"ABS" : true,
"ESP" : false,
"climatronic" : true
}
}
MyCar = { brand : "Mercedes",
extras : 5
}
这些额外功能很容易设置和检索:if(MyCar.extras['4x4']){/*显示一个✓ */ }代码>。它简单易读,但在某些情况下可能需要太多的资源来处理(想想:一个巨大集合上的嵌套循环)
所以我们可以创建一个数组,其中每个索引对应一个特征,对吗
MyCar = { brand : "Mercedes",
// 1: 4x4, 2: ABS, 3: ESP, 4: climatronic
extras : [ false, true, false, true ]
}
现在要检查给定的汽车是否有4x4,您需要使用if(MyCar.extras[0]){/*显示一个✓ */ }代码>。它的可读性较差(您需要查阅文档以了解哪个功能在哪个索引下),但可能更快,需要的内存更少
位掩码的概念类似,但使用数字而不是数组。extras:[false,true,false,true]
可以缩短为extras:[0,1,0,1]
,而0101
是数字5
的二进制表示形式。因此,带有位掩码描述其特征的汽车对象可以如下所示:
MyCar = { brand : "Mercedes",
extras : {
"4x4" : false,
"ABS" : true,
"ESP" : false,
"climatronic" : true
}
}
MyCar = { brand : "Mercedes",
extras : 5
}
这看起来完全不直观,但应该非常快速和轻便。如何检查汽车是否有4x4?好的,4x4表示为1000
(二进制表示为8
),因此:
if(!!(MyCar.extras&8)){/*显示一个✓ */ }代码>
所以,是的,现在我们只从这个代码的外观来讨论黑客。它非常简单,但如果你以前没有使用过按位运算符,它看起来很神秘。进一步解释一下:我们的汽车的附加属性设置为5
,二进制为0101
,我们想检查最左边的位是否设置为1
.bit-wiseAND
操作仅在两个操作数都有1
的情况下返回一个具有1
的数字
0101 // 5
AND 1000 // 8
= 0000
现在让我们检查ABS,它是从左边开始的第二位(0100
,即4
)
因为
0101 // 5
AND 0100 // 4
= 0100
如何将ESP设置为true?简单:
MyCar.extras |= 3; // now extras == 7
发生了什么?二进制或
返回一个具有1
的数字,其中任一操作数具有1
位
5 | 3
=0101 | 0010
=0111
=7
现在要将ABS设置为false,您可以使用
MyCar.extras ^= 4;
我将把二进制XOR
的工作留给读者作为练习,但我希望你能理解使用位掩码和“位旋转”的要点现在。谢谢你的解释。比特旋转更快,这就是为什么它被使用。我想它是用来跟踪过滤后的维度的。像这样实现它很好。但是读者可能无法理解逻辑,这就是为什么它看起来很粗糙的原因。