Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解crossfilter.js位旋转黑客_Javascript_Bit Manipulation_Crossfilter - Fatal编程技术网

Javascript 理解crossfilter.js位旋转黑客

Javascript 理解crossfilter.js位旋转黑客,javascript,bit-manipulation,crossfilter,Javascript,Bit Manipulation,Crossfilter,我在crossfilter.js上找到了它,我正试图理解这句话的意思 交叉过滤器使用排序索引(和一些旋转技巧)来 使之成为可能,显著提高live的性能 直方图和top-K列表 我认为,排序索引指的是在数据库中使用索引。避免进行全表扫描。每个维度都有一个索引,在该索引上进行过滤。这将导致增量筛选(逐个筛选每个索引),最后在最终生成筛选数据时触发事件 但是看着这些图片,我无法理解黑客是什么,它的用途是什么,以及如何使用。有人能解释一下玩比特游戏的目的吗?开头有这样一个声明: m=0,//表示正在使用

我在crossfilter.js上找到了它,我正试图理解这句话的意思

交叉过滤器使用排序索引(和一些旋转技巧)来 使之成为可能,显著提高live的性能 直方图和top-K列表

我认为,排序索引指的是在数据库中使用索引。避免进行全表扫描。每个维度都有一个索引,在该索引上进行过滤。这将导致增量筛选(逐个筛选每个索引),最后在最终生成筛选数据时触发事件


但是看着这些图片,我无法理解黑客是什么,它的用途是什么,以及如何使用。有人能解释一下玩比特游戏的目的吗?

开头有这样一个声明:

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-wise
AND
操作仅在两个操作数都有
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
的工作留给读者作为练习,但我希望你能理解使用位掩码和“位旋转”的要点现在。

谢谢你的解释。比特旋转更快,这就是为什么它被使用。我想它是用来跟踪过滤后的维度的。像这样实现它很好。但是读者可能无法理解逻辑,这就是为什么它看起来很粗糙的原因。