楼主: 〇〇

[有奖问答] 用过程语言实现group by cube的代码挑战赛

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
21#
发表于 2010-2-24 22:42 | 只看该作者
这题目出得不行啊,没什么人感兴趣,两天过去了还是哥几个在闹腾。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
22#
 楼主| 发表于 2010-2-25 06:31 | 只看该作者

回复 #21 newkid 的帖子

可能是哥你抛的砖太玉了,别人一时拿不出更好的了

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
23#
 楼主| 发表于 2010-2-25 08:17 | 只看该作者
也可能是奖太没有吸引力,参见
http://www.itpub.net/viewthread. ... extra=&page=283

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
24#
 楼主| 发表于 2010-2-25 08:34 | 只看该作者
编译器连接 http://www.itpub.net/thread-1227973-1-1.html
感觉从第2层开始可以用并行的方法,c有并行库,pl/sql不知是否支持

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
25#
发表于 2010-2-25 09:25 | 只看该作者
原帖由 newkid 于 2010-2-24 22:42 发表
这题目出得不行啊,没什么人感兴趣,两天过去了还是哥几个在闹腾。

呵呵, 說實話, 我是不太感興趣, 這僅僅涉及到算法而已,而且還有點費時,  基本不涉及到 Oracle 知識.
而且這個算法的實現, 估計不會有太精彩的亮點.

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
26#
 楼主| 发表于 2010-2-25 09:58 | 只看该作者

回复 #25 nyfor 的帖子

对这个具体的数据没有意义,对未知的大表可能还是有意思的
比如根据原始表列的取值范围和行数,分组的要求判断较优的算法(时间和空间)

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
27#
发表于 2010-2-25 10:48 | 只看该作者
原帖由 〇〇 于 2010-2-25 09:58 发表
对这个具体的数据没有意义,对未知的大表可能还是有意思的
比如根据原始表列的取值范围和行数,分组的要求判断较优的算法(时间和空间)

还是CUBE最快,没必要自己整了。如果使用其他数据库不带CUBE的,可以玩玩看。

我那个表,ora连来带回才16ms,单单用树归并就35ms,不玩了。

[ 本帖最后由 yulihua49 于 2010-2-25 10:51 编辑 ]

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
28#
 楼主| 发表于 2010-2-25 12:22 | 只看该作者

计算出了分组的key,c还是挺快,还能自己挑选分组


  1. /* compiled by cl of vc2003*/
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <map>
  6. #include <iostream>
  7. #define addkey {if((key_recn.find(key))== key_recn.end())key_recn[key]=c++;}
  8. using namespace std;
  9. struct ltstr
  10. {
  11.   bool operator()(const char* s1, const char* s2) const
  12.   {
  13.     return strcmp(s1, s2) < 0;
  14.   }
  15. };
  16. struct ltint
  17. {
  18.   bool operator()(const int s1, const int s2) const
  19.   {
  20.     return (s1<s2) ;
  21.   }
  22. };
  23. int main()
  24. {
  25. char* c1=(char*)malloc(1E6L);
  26. char* c2=(char*)malloc(1E6L);
  27. char* c3=(char*)malloc(1E6L);
  28. char* c4=(char*)malloc(1E6L);
  29. int*  v1=(int* )malloc(4E6L);
  30. __int64* v2;//store sum(v1);
  31. long t=clock();
  32. for (int i=0;i<1E6L;i++)
  33. {
  34.         int j=i+1;
  35.         c1[i]=j%4;
  36.         c2[i]=j%5;
  37.         c3[i]=j%67;
  38.         c4[i]=(j%13?j%113:127);
  39.         v1[i]=j;
  40. }


  41. map<const int, int, ltint> key_recn;
  42. int c=0;
  43. for (int i=0;i<1E6L;i++)
  44. {
  45.         int key=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  46.         //printf("key=%d\n",key);
  47.         addkey;

  48. }


  49. int *C=(int*)malloc(c*4);//store count(c1)
  50. int *k=(int*)malloc(c*4);//store key

  51. v2=(__int64*)malloc(c*8);
  52. /*
  53. memset(C,0,c*4); //need?
  54. memset(v2,0,c*8);
  55. */

  56. for (int i=0;i<1E6L;i++)
  57. {
  58. int recn=key_recn[(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i]];
  59. k[recn]=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  60. C[recn]++;
  61. v2[recn]=v2[recn]+v1[i];

  62. }

  63. int c_2=c;
  64. for (int i=0;i<c_2;i++)
  65. {
  66.         int key=(k[i]&0xFFFFFF)+((0x80+15)<<24);//set c1 null ,gid=8
  67.         addkey;
  68.                
  69.         key=(k[i]&0xFF00FFFF)+((0x40)<<24)+(127<<16);//set c2 null,gid=4
  70.         addkey;

  71.         key=(k[i]&0xFFFF00FF)+((0x20)<<24)+(127<<8);//set c3 null,gid=2
  72.         addkey;

  73.         key=(k[i]&0xFFFFFF00)+((0x10)<<24)+(127);//set c4 null,gid=1
  74.         addkey;

  75.         key=(k[i]&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
  76.         addkey;
  77.                
  78.         key=(k[i]&0xFF00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
  79.         addkey;

  80.         key=(k[i]&0xFFFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
  81.         addkey;

  82.         key=(k[i]&0xFF0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
  83.         addkey;
  84.        
  85.         key=(k[i]&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
  86.         addkey;
  87.                
  88.         key=(k[i]&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
  89.         addkey;
  90.                
  91.         key=(k[i]&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
  92.         addkey;

  93.         key=(k[i]&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
  94.         addkey;

  95.         key=(k[i]&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
  96.         addkey;
  97.                
  98.         key=(k[i]&0xFF000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
  99.         addkey;

  100.         key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
  101.         addkey;
  102. }
  103. printf("%dms,recn=%d",clock()-t,c);
  104. /*int d=
  105. printf("%dms,recn=%d,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%ld",clock()-t,c,
  106. (k[c-1]>>24),((k[c-1]>>16)&255),((k[c-1]>>8)&255),(k[c-1]&255),C[c-1],v2[c-1]);
  107. */
  108. free(c1);
  109. free(c2);
  110. free(c3);
  111. free(c4);
  112. free(v1);
  113. free(v2);
  114. free(C);
  115. free(k);
  116. return 0;

  117. }
复制代码

D:\app>map2
811ms,recn=234600

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
29#
 楼主| 发表于 2010-2-25 17:02 | 只看该作者
c纯内存操作1秒完成,不知道读入和写出数据到表的时间

  1. /* compiled by cl of vc2003*/
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <map>
  6. #include <iostream>
  7. #define add_key {if((key_recn.find(key))== key_recn.end())key_recn[key]=c++;}
  8. #define addkey {if((key_recn2.find(key))== key_recn2.end())key_recn2[key]=c++;}
  9. using namespace std;
  10. struct ltstr
  11. {
  12.   bool operator()(const char* s1, const char* s2) const
  13.   {
  14.     return strcmp(s1, s2) < 0;
  15.   }
  16. };
  17. struct ltint
  18. {
  19.   bool operator()(const int s1, const int s2) const
  20.   {
  21.     return (s1<s2) ;
  22.   }
  23. };
  24. int main()
  25. {
  26. char* c1=(char*)malloc(1E6L);
  27. char* c2=(char*)malloc(1E6L);
  28. char* c3=(char*)malloc(1E6L);
  29. char* c4=(char*)malloc(1E6L);
  30. int*  v1=(int* )malloc(4E6L);
  31. __int64* v2;//store sum(v1);
  32. long t=clock();
  33. for (int i=0;i<1E6L;i++)
  34. {
  35.         int j=i+1;
  36.         c1[i]=j%4;
  37.         c2[i]=j%5;
  38.         c3[i]=j%67;
  39.         c4[i]=(j%13?j%113:127);
  40.         v1[i]=j;
  41. }


  42. map<const int, int, ltint> key_recn;
  43. map<const int, int, ltint> key_recn2;
  44. int c=0;
  45. for (int i=0;i<1E6L;i++)
  46. {
  47.         int key=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  48.         //printf("key=%d\n",key);
  49.         add_key;

  50. }


  51. int *C=(int*)malloc(c*4);//store count(c1)
  52. int *k=(int*)malloc(c*4);//store key

  53. v2=(__int64*)malloc(c*8);

  54. memset(C,0,c*4); //need?
  55. memset(v2,0,c*8);


  56. for (int i=0;i<1E6L;i++)
  57. {
  58. int recn=key_recn[(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i]];
  59. k[recn]=(c1[i]<<24)+(c2[i]<<16)+(c3[i]<<8)+c4[i];
  60. C[recn]++;
  61. v2[recn]=v2[recn]+v1[i];

  62. }
  63. printf("%dms,recn=%d\n",clock()-t,c);
  64. t=clock();
  65. int c_2=c;
  66. for (int i=0;i<c_2;i++)
  67. {
  68.         int key=(k[i]&0xFFFFFF)+((0x80+15)<<24);//set c1 null ,gid=8
  69.         addkey;

  70.         key=(k[i]&0xFF00FFFF)+((0x40)<<24)+(127<<16);//set c2 null,gid=4
  71.         addkey;

  72.         key=(k[i]&0xFFFF00FF)+((0x20)<<24)+(127<<8);//set c3 null,gid=2
  73.         addkey;

  74.         key=(k[i]&0xFFFFFF00)+((0x10)<<24)+(127);//set c4 null,gid=1
  75.         addkey;

  76.         key=(k[i]&0xFFFF00)+((0x90+15)<<24)+(127);//set c1,c4 null ,gid=9
  77.         addkey;

  78.         key=(k[i]&0xFF00FF00)+((0x50)<<24)+(127<<16)+(127);//set c2,c4 null,gid=5
  79.         addkey;

  80.         key=(k[i]&0xFFFF0000)+((0x30)<<24)+(127<<8)+(127);//set c3,c4 null,gid=3
  81.         addkey;

  82.         key=(k[i]&0xFF0000FF)+((0x60)<<24)+(127<<16)+(127<<8);//set c2,c3 null,gid=6
  83.         addkey;

  84.         key=(k[i]&0x00FF00FF)+((0xA0+15)<<24)+(127<<8);//set c1,c3 null,gid=10
  85.         addkey;

  86.         key=(k[i]&0xFFFF)+((0xC0+15)<<24)+(127<<16);//set c1,c2 null,gid=12
  87.         addkey;

  88.         key=(k[i]&0xFF00)+((0xD0+15)<<24)+(127<<16)+(127);//set c1,c2,c4 null,gid=13
  89.         addkey;

  90.         key=(k[i]&0xFF)+((0xE0+15)<<24)+(127<<16)+(127<<8);//set c1,c2,c3 null,gid=14
  91.         addkey;

  92.         key=(k[i]&0xFF0000)+((0xB0+15)<<24)+(127<<8)+(127);//set c1,c3,c4 null,gid=11
  93.         addkey;

  94.         key=(k[i]&0xFF000000)+((0x70)<<24)+(127<<16)+(127<<8)+(127);//set c2,c3,c4 null,gid=7
  95.         addkey;

  96.         key=((0xF0+15)<<24)+(127<<16)+(127<<8)+(127);//set c1,c2,c3,c4 null,gid=15
  97.         addkey;
  98. }

  99. int mask[15]={
  100. 0x00FFFFFF,
  101. 0xFF00FFFF,
  102. 0xFFFF00FF,
  103. 0xFFFFFF00,
  104. 0x00FFFF00,
  105. 0xFF00FF00,
  106. 0xFFFF0000,
  107. 0xFF0000FF,
  108. 0x00FF00FF,
  109. 0x0000FFFF,
  110. 0x0000FF00,
  111. 0x000000FF,
  112. 0x00FF0000,
  113. 0xFF000000,
  114. 0x00000000};

  115. int null[15]={
  116. ((0x80+15)<<24),
  117. ((0x40)<<24)+(127<<16),
  118. ((0x20)<<24)+(127<<8),
  119. ((0x10)<<24)+(127),
  120. ((0x90+15)<<24)+(127),
  121. ((0x50)<<24)+(127<<16)+(127),
  122. ((0x30)<<24)+(127<<8)+(127),
  123. ((0x60)<<24)+(127<<16)+(127<<8),
  124. ((0xA0+15)<<24)+(127<<8),
  125. ((0xC0+15)<<24)+(127<<16),
  126. ((0xD0+15)<<24)+(127<<16)+(127),
  127. ((0xE0+15)<<24)+(127<<16)+(127<<8),
  128. ((0xB0+15)<<24)+(127<<8)+(127),
  129. ((0x70)<<24)+(127<<16)+(127<<8)+(127),
  130. ((0xF0+15)<<24)+(127<<16)+(127<<8)+(127)
  131. };


  132. int *C2=(int*)malloc((c-c_2)*4);//store count(c1)
  133. int *k2=(int*)malloc((c-c_2)*4);//store key
  134. __int64* v3=(__int64*)malloc((c-c_2)*8);

  135. memset(C2,0,(c-c_2)*4); //need?
  136. memset(v3,0,(c-c_2)*8);

  137. int y=0;
  138. for (int i=0;i<c_2;i++)
  139. {
  140. for(int j=0;j<15;j++)
  141. {
  142. int recn=key_recn2[(k[i]&mask[j])+null[j]]-c_2;
  143. k2[recn]=(k[i]&mask[j])+null[j];
  144. C2[recn]+=C[i];
  145. v3[recn]=v3[recn]+v2[i];

  146. y=recn;
  147. }
  148. }
  149. printf("%dms,recn=%d,c1=%d,c2=%d,c3=%d,c4=%d,count=%d,sum=%I64d",clock()-t,c,
  150. (k2[y]>>24),((k2[y]>>16)&255),((k2[y]>>8)&255),(k2[y]&255),C2[y],v3[y]);

  151. free(c1);
  152. free(c2);
  153. free(c3);
  154. free(c4);
  155. free(v1);
  156. free(v2);
  157. free(C);
  158. free(k);
  159. free(C2);
  160. free(k2);
  161. free(v3);

  162. return 0;

  163. }
复制代码


D:\>map2
483ms,recn=152760
577ms,recn=234600,c1=-1,c2=127,c3=127,c4=127,count=1000000,sum=500000500000

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
30#
 楼主| 发表于 2010-2-25 18:50 | 只看该作者
用oci读写数据库,direct path、绑定变量真麻烦

oci.rar

528.9 KB, 下载次数: 33

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表