092303295201这段大写数字怎么写排...

随笔 - 131&
&&&&&&&&&&&
转自:/post/how-sort-10-billion-data.html?ref=myread
/外部归并排序 - 分治.cppp
今天要给100亿个数字排序,100亿个 int 型数字放在文件里面大概有 37.2GB,非常大,内存一次装不下了。那么肯定是要拆分成小的文件一个一个来处理,最终在合并成一个排好序的大文件。
1.把这个37GB的大文件,用哈希分成1000个小文件,每个小文件平均38MB左右(理想情况),把100亿个数字对1000取模,模出来的结果在0到999之间,每个结果对应一个文件,所以我这里取的哈希函数是 h = x % 1000,哈希函数取得”好”,能使冲突减小,结果分布均匀。
2.拆分完了之后,得到一些几十MB的小文件,那么就可以放进内存里排序了,可以用快速排序,归并排序,堆排序等等。
3.1000个小文件内部排好序之后,就要把这些内部有序的小文件,合并成一个大的文件,可以用二叉堆来做1000路合并的操作,每个小文件是一路,合并后的大文件仍然有序。
首先遍历1000个文件,每个文件里面取第一个数字,组成 (数字, 文件号) 这样的组合加入到堆里(假设是从小到大排序,用小顶堆),遍历完后堆里有1000个 (数字,文件号) 这样的元素然后不断从堆顶拿元素出来,每拿出一个元素,把它的文件号读取出来,然后去对应的文件里,加一个元素进入堆,直到那个文件被读取完。拿出来的元素当然追加到最终结果的文件里。按照上面的操作,直到堆被取空了,此时最终结果文件里的全部数字就是有序的了。最后我用c++写了个实验程序,具体代码在这里可以看到。
如何拆分大文件?
一个32G的大文件,用fopen()打开不会全部加载到内存的,然后for循环遍历啊,把每个数字对1000取模,会得到0到999种结果,然后每种结果在写入到新的文件中,就拆分了
// 对 2 亿个数字进行排序, 约 10 G 的文件, 每个数字 int 能表示
// 算法流程
// 将 10 G 的文件散列到 300 个文件中, 每个文件大约 35 MB
// 对 35 MB 的小文件内部排序, 或者分发到多台计算机中, 并行处理 MapReduce
// 最后使用最小堆, 进行 300 路归并排序, 合成大文件
// 再写一个算法判断 2 亿个数字是否有序
#include &stdio.h&
#include &stdlib.h&
#include &time.h&
#include &io.h&
#include &queue&
#define FILE_NUM 300 // 哈希文件数
#define HASH(a) (a % FILE_NUM)
int num = 6000000; // 2 亿个数字, 手动改
char path[20] = "c:\\data.dat"; // 待排文件
char result[20] = "c:\\result.dat"; // 排序后文件
char tmpdir[100] = "c:\\hashfile"; // 临时目录
// 随机生成 2 亿个数字
int write_file(void)
  FILE *out = NULL;
  printf("\n正在生成 %d 个数字...\n\n", num);
  out = fopen(path, "wt");
  if (out == NULL) return 0;
  unsigned int s,
  e = s = clock();
  for (i=0; i& i++)
    e = clock();
    if (e - s & 1000) // 计算进度
      printf("\r处理进度 %0.2f %%\t", (i * 100.0) / num);
      s =
    fprintf(out, "%d\n",
        (rand() % 31623) * (rand() % 31623));
  fclose(out);
  return 1;
// 对 2 亿个数字进行哈希, 分散到子文件中
// 入口参数: path, tmpdir
int map(void)
  FILE *in = NULL;
  FILE *tmp[FILE_NUM + 5];
  char hashfile[512]; // 哈希文件地址
  int data,
  printf("\r正在哈希 %s\n\n", path);
  in = fopen(path, "rt");
  if (in == NULL) return 0;
  for (i=0; i&FILE_NUM; i++) tmp[i] = NULL;
  // 开始哈希, 核心代码要尽可能的加速
  unsigned int s,
  e = s = clock();
  i = 0;
  while (fscanf(in, "%d", &data) != EOF)
    add = HASH(data);
    if (tmp[add] == NULL)
      sprintf(hashfile, "%s\\hash_%d.~tmp", tmpdir, add);
      tmp[add] = fopen(hashfile, "a");
    fprintf(tmp[add], "%d\n", data);
    i++;
    e = clock(); // 计算进度
    if (e - s & 1000)
      printf("\r处理进度 %0.2f %%\t", (i * 100.0) / num);
      s =
  for (i=0; i&FILE_NUM; i++)
  if (tmp[i]) fclose(tmp[i]);
  fclose(in);
  return 1;
// 对 300 个文件逐个排序, 采用堆排序 STL 的优先队列
void calc(void)
  int fileexist(char *path); // 判断文件存在
  std::priority_queue&int& // 堆排序
  char hashfile[512];
  FILE *fp = NULL;
  int i,
  // 逐个处理 300 个文件, 或者将这些文件发送到其它计算机中并行处理
  for (i=0; i&FILE_NUM; i++)
    sprintf(hashfile, "%s\\hash_%d.~tmp", tmpdir, i);
    if (fileexist(hashfile))
      printf("\r正在排序 hash_%d.~tmp\t", i);
      // 小文件从磁盘加入内存中
      fp = fopen(hashfile, "rt");
      while (fscanf(fp, "%d", &data) != EOF)
      {
        q.push(data);
        // 优先队列默认是大顶堆, 即降序排序
        // 要升序需要重载 () 运算符
      }
      fclose(fp);
      // 排序后再从内存写回磁盘
      fp = fopen(hashfile, "wt"); // 覆盖模式写
      while (!q.empty())
      {
        fprintf(fp, "%d\n", q.top());
        q.pop();
      }
      fclose(fp);
typedef struct node // 队列结点
   // 哈希文件的编号
  bool operator & (const node &a) const
  { return data & a. }
// 将 300 个有序文件合并成一个文件, K 路归并排序
int reduce(void)
  int fileexist(char *path);
  std::priority_queue&node& // 堆排序
  FILE *file[FILE_NUM + 5];
  FILE *out = NULL;
  char hashfile[512];
  node tmp,
  int i, count = 0;
  printf("\r正在合并 %s\n\n", result);
  out = fopen(result, "wt");
  if (out == NULL) return 0;
  for (i=0; i&FILE_NUM; i++) file[i] = NULL;
  for (i=0; i&FILE_NUM; i++) // 打开全部哈希文件
    sprintf(hashfile, "%s\\hash_%d.~tmp", tmpdir, i);
    if (fileexist(hashfile))
      file[i] = fopen(hashfile, "rt");
      fscanf(file[i], "%d", &tmp.data);
      tmp.id =
      q.push(tmp); // 初始化队列
      count++; // 计数器
      printf("\r入队进度 %0.2f %%\t", (count * 100.0) / FILE_NUM);
  unsigned int s,
  e = s = clock();
  while (!q.empty()) // 开始 K 路归并
    tmp = q.top();
    q.pop();
    // 将堆顶的元素写回磁盘, 再从磁盘中拿一个到内存
    fprintf(out, "%d\n", tmp.data);
    if (fscanf(file[tmp.id], "%d", &p.data) != EOF)
      p.id = tmp.
      q.push(p);
      count++;
    e = clock(); // 计算进度
    if (e - s & 1000)
      printf("\r处理进度 %0.2f %%\t", (count * 100.0) / num);
      s =
  for (i=0; i&FILE_NUM; i++)
  if (file[i]) fclose(file[i]);
  fclose(out);
  return 1;
int check(void) // 检查是否降序排序
  FILE *in = NULL;
  int max = 0x7FFFFFFF;
  int count = 0;
  printf("\r正在检查文件正确性...\n\n");
  in = fopen(result, "rt");
  if (in == NULL) return 0;
  unsigned int s,
  e = s = clock();
  while (fscanf(in, "%d", &data) != EOF)
    if (data &= max) max =
    else
      fclose(in);
      return 0;
    count++;
    e = clock(); // 计算进度
    if (e - s & 1000)
      printf("\r处理进度 %0.2f %%\t", (count * 100.0) / num);
      s =
  fclose(in);
  return 1;
// 判断文件存在
int fileexist(char *path)
  FILE *fp = NULL;
  fp = fopen(path, "rt");
  if (fp)
    fclose(fp);
    return 1;
  else return 0;
int main(void)
  char cmd_del[200]; // 删除目录
  char cmd_att[200]; // 设置隐藏
  char cmd_mkdir[200]; // 建立目录
  // 初始化 cmd 命令, 建立工作目录
  sprintf(cmd_del, "rmdir /s /q %s", tmpdir);
  sprintf(cmd_att, "attrib +h %s", tmpdir);
  sprintf(cmd_mkdir, "mkdir %s", tmpdir);
  if (access(path, 0) == 0) system(cmd_del);
  system(cmd_mkdir); // 建立工作目录
  system(cmd_att); // 隐藏目录
  // 随机生成 2 亿个数字
  if (!write_file()) return 0;
  map(); // 对 2 亿个数字进行哈希, 即 Map
  calc(); // 对 300 个文件逐个排序
  reduce(); // 最后将 300 个有序文件合并成一个文件, 即 reduce
  if (check()) printf("\r排序正确!\t\t\t\n\n");
  else printf("\r排序错误!\t\t\t\n\n");
  system(cmd_del); // 删除哈希文件
  remove(path); // 删除 2 亿数字文件
  remove(result); // 删除排序后的文件
  return 0;
阅读(...) 评论()用选出来的牌排在第一位的数字相加,就得到你所想的数!这是什么牌?上面的数字怎么排列?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
用选出来的牌排在第一位的数字相加,就得到你所想的数!这是什么牌?上面的数字怎么排列?
一种牌,共六七张左右,每张上面有三十多个1——60内的不重复的数字。开始的时候你要从这几张牌中选出有你心中所想的数字,然后用选出来的牌的第一位数字相加,就得到你所想的数!某张牌的样式——
问题暂时关闭
//d;+&4&=&2&+&114&=&nbsp。把这些牌的第一个数字相加,就是你心里挑的数字。这个游戏利用了一个数学性质就是;=&32&+&nbsp:2&nbsp./zhidao/wh%3D450%2C600/sign=408f7bb5a61ea8d38a777c00a23a1c78/0dd7912397dda144de41a0bcb2b7d0a20cf48670;4&+&nbsp://d、4;2&+&/zhidao/pic/item/0dd7912397dda144de41a0bcb2b7d0a20cf48670.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http。排出了你要的牌如图,图片挺大的。6张牌,终于理解楼主说什么了。并找出楼主所问的关键;8&+&nbsp.jpg" esrc="http、32……直到2的N次方&可以从中挑出唯一可能的一个数或多个数,每个数只使用一次。例如;4&+&nbsp./zhidao/wh%3D600%2C800/sign=1ffbc3ec65d0eccb2bb8a26/0dd7912397dda144de41a0bcb2b7d0a20cf48670;16&nbsp、32,分布在6张牌里,放第一个。例如上面提到的63,这个数字必须出现在所有6张牌里。对14;163&=&2&=&16&+&nbsp我看了半天。<a href="http://d.hiphotos.baidu,可以覆盖1-63这63个数字,就是在1-63里心中任选一个数字、2开头的牌里。把我给出的牌上的数字,除每张牌的第一个数字外打乱顺序,别人就很难看出玄机啦,相加生成1到2的N+1次方中的任一个数,只出现在8;+&8&131&4&+&=&16&+&nbsp,对照牌面抽出包含有这个数字的牌;221&nbsp:数字序列1、2、4、8、16;8&+&nbsp。对其他需要组合相加才能得到的数,需要用哪些数字,就会出现在以这个数字开头的牌里面;3&+&1因此楼主说的关键的第一个数字就是1、2、4、8、16;+&2&nbsp
采纳率:85%
然后把第一位数字相加吗看不懂。是说你选一个数,然后拿出所有有这个数的牌。比如有三张牌(简单点的),分别是1 3 52 3 64 6 5这样你选1,只有第一张有?那只要保证这样选出牌加起来是唯一的这些牌共有的数字就可以了
来自:求助得到的回答
你说这个让我想起在刘谦的一本书上看到的一个魔术,好像类似,这个和数字的排列有关,具体规律想不起来了,希望能帮到你吧
我记得还得从这几张牌里找出你所想的数字。把每张牌拿出来,牌上的第一个数想加就是你所想的数。是这样的吗?如果你不急用,哪天我给你找找。
其他1条回答
为您推荐:
其他类似问题
等待您来回答数字排列规律
我的图书馆
数字排列规律
数字排列规律& (11) 2,12,23,52,() A 61 B 74 C 76 D 82 【解析】 2=0+2 1+2=3 2+3=5 5+2=7 7+4=11
数位数字构成质数列
12) 1,1,2,6,8,11,() A 13 B 17 C 18 D 20 【解析】 1+1+2=4 1+2+6=9 2+6+8=16 6+8+11=25 8+11+17=36 小数字 可以尝试几个加起来,构成平方数列
(13) 3,3,9,33,93,() A 210 B 213 C 216 D 222 【解析】 3-3=0=1^3-1 9-3=6=2^3-2 33-9=24=3^3-3 93-33=60=4^3-4 213-93=120=5^3-5
0,6,24,60 !!!!!!!!!!!!
分别是 1^3-1 2^3-2& 3^3-3& 4^3-4 ...... n^3 - n
TA的最新馆藏[转]&
喜欢该文的人也喜欢怎样解决两位阿拉伯数字竖排问题? - CPC中文印刷社区
◆- Adobe 设计软件 Photoshop、Illustrator、Indesign、FrameMaker、Indesign Server、Pagemaker 等adobe公司出品的平面设计类软件。
等级: 三袋长老
Uid: 23101
注册日期: , 17:01
现金: 1金币
资产: 1金币
3 个帖子获得 3 次感谢
怎样解决两位阿拉伯数字竖排问题?
带两位阿拉伯数字的文字块竖排,数字就被拆开了,一个在上,一个在下,怎样可能解决啊
等级: 六袋长老
Uid: 97430
注册日期: , 13:53
来自: 美丽蓉城
现金: 232金币
资产: 332金币
181 个帖子获得 257 次感谢
先按下T,在按下Shift+T就OK
__________________
花有重开日
人无往少年
排版设计之家QQ群
方正书版、飞腾、CD、PS、ID、AI、PDF等排版设计制作,专门解决各种疑难杂症↑↑
我们不生产艺术,我们只是艺术的搬运工……
等级: 三袋长老
Uid: 23101
注册日期: , 17:01
现金: 1金币
资产: 1金币
3 个帖子获得 3 次感谢
答非所问啊,我知道怎么竖着打字,不是那个意思
自定义头衔
等级: 七袋长老
Uid: 65377
注册日期: , 12:07
现金: 4831金币
资产: 4831金币
570 个帖子获得 1319 次感谢
不知道是不是这个意思呢
上传的图像
(33.8 KB, 55 次查看)
__________________
个性签名广告位招租.
等级: 七袋长老
注册日期: , 15:43
现金: 31金币
资产: 4903金币
113 个帖子获得 134 次感谢
ID,方法很多。提供一种。看图
可以看到,这时候两个数字横排比一个汉字要宽,很难看。建议用等宽半角数字替换。最后的效果如下:
被 longz 编辑.
等级: 六袋长老
Uid: 40111
注册日期: , 18:49
现金: 2674金币
资产: 2674金币
89 个帖子获得 151 次感谢
作者: 苹果又见苹果
带两位阿拉伯数字的文字块竖排,数字就被拆开了,一个在上,一个在下,怎样可能解决啊
请说明在什么软件里啊,不然怎么回答?
您不可以发表主题
您不可以回复帖子
您不可以上传附件
您不可以编辑自己的帖子
论坛禁用 HTML 代码
律师声明:本站内容,均具有版权,未经书面授权,禁止转载,严禁镜像,违者承担一切后果!
&nbsp 广告联系: &nbsp 站务管理:
所有时间均为 +8, 现在的时间是 .
Powered by vBulletin& Version 3.8.11 Beta 2Copyright &2000 - 2017, vBulletin Solutions, Inc.
Please enable / Bitte aktiviere JavaScript!请启用浏览器的 Javascript!

我要回帖

更多关于 大写数字怎么写 的文章

 

随机推荐