集合关系运算符,集合关系的表示方法

  集合关系运算符,集合关系的表示方法

  包含关系的快速算法——模拟博客花园

  包含关系的快速算法

  2012-10-05 22:18 by simcity,751阅读,0评论,收藏,编辑

  #1每行数据代表一个集合。怎样才能判断集合的包含关系?-收集的数据仅在有限的范围内。

  0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23a-24元素

  1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24b-24元素

  最容易想到的就是蛮力操作。在计算之前,你也应该知道谁的元素多吧?还好,我耍了一招。在读取数据时,我已经将数组元素的个数存储到了数组的第0个元素中。

  对于a中的每个元素x为1

  2如果(!setContain(b,x))

  3返回假;

  四

  5返回true

  #2数据在31以内,所以考虑用无符号数编码数组。

  比如1 2 3 4用0x 000000000000000000000000000000111编码,即1用第一位,2用第二位,依此类推。

  但是数据中有0,可以这么说,0用第一位,1用第二位,依此类推.

  1 2 3 4最终形式是0x 00000000000000000000000000000000000000000001110

  所以判断起来就容易多了,就

  复制代码

  1无符号src //表示更多元素数组的编码。

  2 unsigned dst //表示较少元素的数组的编码。

  3如果(src dst==dst)

  4返回true

  五

  6返回假;

  复制代码

  但是等一下,如何将1 2 3 4这样的元素存储到src这样的变量中呢?

  于是,手工加工的桌子出现了。

  复制代码

  1无符号整数表[32]={

  20x00000001、0x00000002、0x00000004、0x00000008、

  30x00000010、0x00000020、0x00000040、0x00000080、

  40x00000100、0x00000200、0x00000400、0x00000800、

  50x00001000、0x00002000、0x00004000、0x00008000、

  60x00010000、0x00020000、0x00040000、0x00080000、

  70x00100000、0x00200000、0x00400000、0x00800000、

  80x01000000、0x02000000、0x04000000、0x08000000、

  90x10000000、0x20000000、0x40000000、0x80000000

  10 };

  复制代码

  您只需要对每个阵列扫描一次就可以实现目标。

  1 src=0;

  2

  对于a中的每个元素x为3

  4 src=src表[x];

  问题基本解决了。

  #3考虑下面的数组:如何扩展到64位

  25 26 27 28 29 30 31 32 33 34 35 36 37 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

  26 27 28 29 30 31 32 33 34 35 36 37 38 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

  按照下图来考虑。

  复制代码

  数字位

  0 1。。

  31 32

  32 - 0 1。。

  63 - 31 32

  复制代码

  重建数组

  1 int cache={0,32 };

  2未签名的int cache manager[2][2];

  3 //二维数组用来维护两个数组的代码,每行编码一个数组。

  方法如下,分别以16和63为例。

  操作(160x00000020) 5产生0,然后16-cache[0]产生16,存储在cacheManager[?][ 0 ]

  操作(630x00000020) 5产生1,然后63-cache[1]产生31,存储在cacheManager[?][ 1 ]

  #4实际代码,使用这种方法,程序的运行时间缩短到原来的1/3。

  复制代码

  1 int fillCacheManager(normalInt * index,Element (* dt)[ElementNumber],unsigned int (*cm)[cacheLine],unsigned int * table){

  2 int元素;

  3 int cache[2]={0,32 };

  4 int串行;

  五

  6 for(归一化m=1;m=索引[0];m ){

  7归一化t=指数[m];

  8cm[t][0]=0;

  9cm[t][1]=0;

  10 for(归一化n=1;n=dt[t][0];n ){

  11元素=dt[t][n];

  12 serial=(element0x 00000020)5;

  13 element=element-cache[serial];

  14 cm[t][serial]=cm[t][serial]表[元素];

  15 }

  16 }

  17

  18返回0;

  19 }

  20

  21

  22 int quicktablereduction(normalInt * index,Element (* dt)[ElementNumber],unsigned int (*cm)[cacheLine]){

  23正规子集=索引[0];

  24 if (subset==0)返回-1;

  25

  26 for(归一化m=1;m子集;m ){

  27 if (index[m] 0)继续;

  28

  29 for(规格化n=m ^ 1;n子集1;n ){

  30 if(index[n] 0)继续;

  31如果(n==m)继续;

  32

  33归一化src=指数[m];

  34 normal int dst=index[n];

  35 normalInt QQ=dst

  36 bool swaped=false

  37 if (dt[src][0] dt[dst][0]){

  38 swaped=true

  39 QQ=src

  40 }

  41

  42 if((cm[src][0]cm[dst][0])==cm[QQ][0](cm[src][1]cm[dst][1])==cm[QQ][1]){

  43 int t=m;

  44如果(交换)t=n;

  45 index[t]=-2;

  46索引[0]=索引[0]-1;

  47 if(swapped==false)break;

  48 }

  49 }

  50 }

  51

  52 normal int idx[索引计数];//索引结束

  53归一化len=1;

  54为(归一化m=1;索引[m]!=indexOverm)//m=索引[0]

  55如果(索引[m] -1){

  56 idx[len]=index[m];

  57 len

  58 }

  59

  60为(归一化m=1;m m)index[m]=idx[m];

  61 index[len]=indexOver;

  62

  63返回0;

  64 }

  复制代码

  #5 STL位集:更好的选择?

  分类:C/C

集合关系运算符,集合关系的表示方法