C语言生成2000w行数据的两个实现

代码摘自百度贴吧,原贴地址:http://tieba.baidu.com/p/1626351476

以下两个代码均在linux下GCC测试通过

要求:

字符串长度为16
字符串只能包含大小写字母和数字
要求生成20000000行的TXT文本


/**********************************
* Author: Ervin_Zhao(2012.6)
* Compile: gcc
* Create a file named test.txt, included 2000w line random string
* string have 16 num used A-Z, a-z, 0-9
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    char array[]="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
    char buff[170000];
    char *buff2 = buff;
    int file = open("test.txt", O_WRONLY|O_CREAT, S_IRWXU|S_IRGRP|S_IROTH);
    int i;
    int temp[4];
    char *p = (char *)temp;
    for(i = 0; i<20000000; i++)
    {
        temp[0] = rand();
        temp[1] = rand();
        temp[2] = rand();
        temp[3] = rand();

        buff2[0] = array[p[0]%(sizeof(array)-1)];
        buff2[1] = array[p[1]%(sizeof(array)-1)];
        buff2[2] = array[p[2]%(sizeof(array)-1)];
        buff2[3] = array[p[3]%(sizeof(array)-1)];

        buff2[4] = array[p[4]%(sizeof(array)-1)];
        buff2[5] = array[p[5]%(sizeof(array)-1)];
        buff2[6] = array[p[6]%(sizeof(array)-1)];
        buff2[7] = array[p[7]%(sizeof(array)-1)];

        buff2[8] = array[p[8]%(sizeof(array)-1)];
        buff2[9] = array[p[9]%(sizeof(array)-1)];
        buff2[10] = array[p[10]%(sizeof(array)-1)];
        buff2[11] = array[p[11]%(sizeof(array)-1)];

        buff2[12] = array[p[12]%(sizeof(array)-1)];
        buff2[13] = array[p[13]%(sizeof(array)-1)];
        buff2[14] = array[p[14]%(sizeof(array)-1)];
        buff2[15] = array[p[15]%(sizeof(array)-1)];

        buff2[16] = '\n';
        buff2 += 17;

        if(buff2 >= (buff+sizeof(buff)))
        {
            write(file, buff, sizeof(buff));
            buff2 = buff;
        }
    }
    close(file);
    return 0;
}

程序执行时间:

real	0m11.494s
user	0m7.860s
sys	0m0.296s



第二个:

/**********************************
* Author: Ervin_Zhao(2012.6)
* Compile: gcc
* Create a file named test.txt, included 2000w line random string
* string have 16 num used A-Z, a-z, 0-9
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <time.h>

int main ( void )
{
    int i, j;
    const int cols = 16;
    const int rows = 20000000;
    const int size = ( cols + 1 ) * rows;
    const char str[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
    const char filename[] = "file.txt";
    char * p = NULL;
    char * pStart = NULL;
    int fd;
    p = pStart = (char *)malloc( size * sizeof(char) );
    if ( p == NULL )
    {
        fprintf ( stderr, "内存申请失败。\n" );
        return EXIT_FAILURE;
    }
    srand( time(NULL) );
    for ( i = 0 ; i < rows; i ++ )
    {
        for ( j = 0 ; j < cols; j ++ )
        {
            *(p ++) = str[rand()%(62)];
        }
        *(p ++) = '\n';
    }
    fd = open( filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
    if ( fd == -1 )
    {
        fprintf ( stderr, "文件打开错误。\n" );
        return EXIT_FAILURE;
    }
    write ( fd, pStart, size );
    free( pStart );
    close(fd);
    return EXIT_SUCCESS;
}

程序执行时间:

real    0m4.381s
user    0m3.108s
sys    0m0.336s

生成文件:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到 (2)设置适当的标志位,作为对记录进操作的 (3)写同名文件将覆盖原来文件的 2.增加学生记录 (1) 可在已有记录后面追加新的记录 (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 (1) 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次” 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录(3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进排序 (1) 可以按”学号”进升序和降序排列 (2) 可以按”姓名”进升序和降序排列 (3) 可以按”名次”进升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序
好的,我可以为您编写两种算法的 C 代码,并让您输入数据测试。以下是代码: ### Kruskal算法 ```c #include <stdio.h> #include <stdlib.h> // 定义边 struct Edge { int u, v, w; }; // 定义并查集 struct UnionFind { int *parent; int *size; }; // 初始化并查集 void makeSet(struct UnionFind *uf, int n) { uf->parent = (int *)malloc(sizeof(int) * n); uf->size = (int *)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) { uf->parent[i] = i; uf->size[i] = 1; } } // 查找根节点 int find(struct UnionFind *uf, int x) { if (uf->parent[x] != x) { uf->parent[x] = find(uf, uf->parent[x]); } return uf->parent[x]; } // 合并两个集合 void merge(struct UnionFind *uf, int x, int y) { int rootX = find(uf, x); int rootY = find(uf, y); if (rootX == rootY) { return; } if (uf->size[rootX] > uf->size[rootY]) { int temp = rootX; rootX = rootY; rootY = temp; } uf->parent[rootX] = rootY; uf->size[rootY] += uf->size[rootX]; } // 比较函数,用于排序边 int cmp(const void *a, const void *b) { return (*(struct Edge *)a).w - (*(struct Edge *)b).w; } // Kruskal算法 void kruskal(struct Edge *edges, int n, int m) { struct UnionFind uf; makeSet(&uf, n); int count = 0; for (int i = 0; i < m; i++) { if (count == n - 1) { break; } int u = edges[i].u; int v = edges[i].v; if (find(&uf, u) != find(&uf, v)) { merge(&uf, u, v); printf("%d %d %d\n", u, v, edges[i].w); count++; } } free(uf.parent); free(uf.size); } int main() { int n, m; printf("请输入节点数和边数:"); scanf("%d %d", &n, &m); struct Edge *edges = (struct Edge *)malloc(sizeof(struct Edge) * m); printf("请依次输入每条边的起点、终点、权值:\n"); for (int i = 0; i < m; i++) { scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w); } qsort(edges, m, sizeof(struct Edge), cmp); printf("最小生成树的边为:\n"); kruskal(edges, n, m); free(edges); return 0; } ``` ### Prim算法 ```c #include <stdio.h> #include <stdlib.h> // 定义邻接矩阵 int **adj; // Prim算法 void prim(int n) { int *visited = (int *)malloc(sizeof(int) * n); int *dist = (int *)malloc(sizeof(int) * n); int *parent = (int *)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) { visited[i] = 0; dist[i] = INT_MAX; parent[i] = -1; } dist[0] = 0; for (int i = 0; i < n - 1; i++) { int u = -1; for (int j = 0; j < n; j++) { if (!visited[j] && (u == -1 || dist[j] < dist[u])) { u = j; } } visited[u] = 1; for (int v = 0; v < n; v++) { if (!visited[v] && adj[u][v] < dist[v]) { dist[v] = adj[u][v]; parent[v] = u; } } } printf("最小生成树的边为:\n"); for (int i = 1; i < n; i++) { printf("%d %d %d\n", parent[i], i, adj[parent[i]][i]); } free(visited); free(dist); free(parent); } int main() { int n, m; printf("请输入节点数和边数:"); scanf("%d %d", &n, &m); adj = (int **)malloc(sizeof(int *) * n); for (int i = 0; i < n; i++) { adj[i] = (int *)malloc(sizeof(int) * n); for (int j = 0; j < n; j++) { adj[i][j] = INT_MAX; } } printf("请依次输入每条边的起点、终点、权值:\n"); for (int i = 0; i < m; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); adj[u][v] = w; adj[v][u] = w; } prim(n); for (int i = 0; i < n; i++) { free(adj[i]); } free(adj); return 0; } ``` 您可以自输入数据测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值