Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54511
  • 博文数量: 16
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-08 19:32
文章分类

全部博文(16)

文章存档

2008年(16)

我的朋友
最近访客

分类: C/C++

2008-04-13 10:24:40

问题一:
一个文件,包含[0,10000000)的10000000个不重复的随机排列的数,
1,请将该文件的数进行排序,并输出到一个文件中。
如:
input.txt
1
0
2
output.txt
0
1
2
2,如果系统只能给你提供大概1M左右的内存,你的程序是否还能运行?
3,由于考虑用户体验度,要求排序时间只能为10秒左右,你的程序又能满足吗?


问题二:
在解决上述问题的同时,可能你要构造一个包含10000000个不重复的随机排列的数,这个具体又该怎么实现呢?

问题一解决方法:因为数字不重复可以考虑用标志位来设置,0表示出现;1表示未出现。设置所有数对应的标志位后,从0遍历到10000000,一次判断标志位是否为1,是则输出到相应文件,反之则不输出。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BEGIN 0
#define END 10000000
#define NUM (END - BEGIN)
#define BIT 32
#define SHIFT 5
#define MASK 0x1f

int a[1 + NUM/BIT];

void set(int i)
{
    a[i>>SHIFT] |= (1 << (i & MASK));
}

void init(int i)
{
    a[i>>SHIFT] &= ~(1 << (i & MASK));
}

int test(int i)
{
    return (a[i>>SHIFT] & (1 << (i & MASK)));
}



void main()
{
    FILE *fpIn, *fpOut = NULL;
    char cBuffer[8] = {0};
    char cEnter = '\n';
    char *pcTemp = NULL;
    int iStrto,i = 0;
    clock_t start,finish = 0;
    double duration;

    start = clock();

    fpIn = fopen("in.txt", "r");
    fpOut = fopen("out.txt", "w+");

    while(!feof(fpIn))
    {
        *cBuffer = '\0';
        pcTemp = cBuffer;

        fread(pcTemp, sizeof(unsigned char), 1, fpIn);

        if(*pcTemp == '\0')
        {
            break;
        }

        while(*pcTemp != cEnter)
        {
            pcTemp++;
            fread(pcTemp, sizeof(unsigned char), 1, fpIn);
        }

        *pcTemp = '\0';

        iStrto = atoi(cBuffer);
        set(iStrto);
    }
    
    for(i=BEGIN; i<END; i++)
    {
        if(test(i))
        {
            itoa(i, cBuffer, 10);
            fwrite(cBuffer, sizeof(unsigned char), strlen(cBuffer), fpOut);
            fwrite(&cEnter, sizeof(unsigned char), 1, fpOut);
        }
    }

    fclose(fpIn);
    fclose(fpOut);

    finish = clock();

    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf( "%f seconds\n", duration );
}

void init_in()
{
    FILE *fpIn = NULL;
    int i = 0;
    char cBuffer[8] = {0};
    char cEnter = '\n';
    
    fpIn = fopen("in.txt", "w+");
    for(i=BEGIN; i<END; i++)
    {
        itoa(i, cBuffer, 10);
        fwrite(cBuffer, sizeof(unsigned char), strlen(cBuffer), fpIn);
        fwrite(&cEnter, sizeof(unsigned char), 1, fpIn);
    }
    
    fclose(fpIn);
}

 

阅读(941) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:有趣的诗

给主人留下些什么吧!~~