【编程珠玑】第一章电话号码排序

编程珠玑——电话号码排序 编程珠玑第一章,电话号码排序,问题是这样的,给你大约1000万个 阅读详情

输入:一个包含100万个正整数的文件,每个数都小于1000万。如果在输入文件中有任何整数重复出现就是致命错误,没有其他数据与该整数相关联。

输出:按升序排列的输入整数的列表。


#include <iostream>
#include <set>
#include <ctime>
#include <stdlib.h>
using namespace std;

int randInt(int start, int end)
{
  srand(time(0));
  int r = RAND_MAX*rand() + rand();
  return start + r%(end-start+1);
}

// 1.利用 C/qsort
int compare(const void *x, const void *y)
{
  return *(int*)x-*(int*)y;
}

void qSort(int a[], int n)
{
  int i;
  qsort(a, n, sizeof(int), compare);
  for (i=0; i<n; i++) ;
    //cout<<a[i]<<endl;
}

// 2.利用 C++/STL/set
void stlSort(int a[], int n)
{
  set<int> S;
  int i;
  set<int>::iterator j;
  for (i=0; i<n; i++)
    S.insert(a[i]);
  for (j=S.begin(); j!=S.end(); j++) ;
    //cout<<*j<<endl;
}

// 3.位图法
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

// a / n = a >> n (if a>0)
// a % n = a & (n-1)
int b[1+N/BITSPERWORD];
void setBit(int i) { b[i>>SHIFT] |= (1<<(i & MASK)); }
void clrBit(int i) { b[i>>SHIFT] &= ~(1<<(i & MASK)); }
int testBit(int i) { return b[i>>SHIFT] & (1<<(i & MASK)); }

void bitSort(int a[], int n)
{
  int i;
  for (i=0; i<N; i++)
    clrBit(i);
  for (i=0; i<n; i++)
    setBit(a[i]);
  for (i=0; i<N; i++)
    if (testBit(i)) ;
      //cout<<i<<endl;
}

// 测试主程序
int main()
{
  int i;
  int k = 1000000;
  int *a = new int[N];
  time_t start, end;

  // 随机生成100万个不同的整数
  start = clock();
  for (i=0; i<N; i++)
    a[i] = i;
  for (i=0; i<k; i++)
    swap(a[i], a[randInt(i, N-1)]);
  end = clock();
  cout<<"create data : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl;

  start = clock();
  bitSort(a, k);
  end = clock();
  cout<<"bitSort : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl;

  start = clock();
  stlSort(a, k);
  end = clock();
  cout<<"STL set sort : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl;

  start = clock();
  qSort(a, k);
  end = clock();
  cout<<"use qsort sort: "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl;

  delete []a;
  return 0;
}

运行结果:


【读薄《编程珠玑》】贰 啊哈!算法 这篇文章是[《读薄<编程珠玑>》系列博客][1]的第 贰 篇,在这篇文章中,作者提出了三个问题,并且给出了相应的解决方案,本文阐述了这三个问题以及解决方案,并且对课后习题进行了分析。 问题集合 0x00: 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失一个这样的数)。在具有足够内存的情况下,如何解决该问题?如果有几个外部的『临时』文件可用,但 阅读详情

相关推荐

《编程珠玑》——第一章习题

1.6习题 3. 程序如下 #!/usr/bin/env python # encoding: utf-8 """ @version: ?? @author: Dawei Gao @contact: david_gao@buaa.edu.cn @software: PyCharm @file: dataForSorting.py @time: 2017/10/17 下午9:04 ""

大大的尾巴的博客 541

电话号码排序

编程珠玑第一章,电话号码排序,问题是这样的,给你大约1000万个数字,让你用最快的方式进行排序,限制如下:1. 内存大约1M2. 数字都是整数,且不重复3. 数字的范围最大是7位数。文章提到了大约三种解法,第一种是归并算法,只不过不在内存,在外存上做归并排序。大致思路是将原始文件读入,然后按照数字的大小划分10份,写到10个文件里。这样每个文件就小于1M,然后对每个文件进行排序,排序之后,将文件合...

qpzkobe的博客 4685

电话簿排序

问题描述】编写一个程序,输入N个用户的姓名和电话号码,按照用户姓名的词典顺序排列输出用户的姓名和电话号码。 【输入形式】用户首先在第一行输入一个正整数,该正整数表示待排序的用户数目,然后在下面多行输入多个用户的信息,每行的输入格式为:姓名 电话。以回车结束每个用户的输入。 【输出形式】程序输出排序后的结果。每行的输出结果格式也是: 姓名 电话。姓名和电话字段中间没有空格,要求用户姓名不能超过10个字符,超出10个字符时候只取前10个字符作为姓名。电话号码不能超过10位,超过10位时只按10位处理。输出姓名、电话字段各占12个字符宽,输出格式采用默认对齐方式。另外,用户的数量要求不超过50个。

编程珠玑第一章,电话号码排序问题

/* * 编程珠玑第一章,电话号码排序问题 */ #include #include #include #include using namespace std; /*随机数产生函数 * n 随机数产生范围(1,n) * m 输出的随机数的个数 * arrayM是存放输出结果的整数数组 */ void randInt(int n, int m, int arrayM[]

albon arith 1623

Ollama内网离线部署大模型实战:从模型文件到私有化服务

本文详细介绍了如何在内网离线环境下,利用Ollama部署私有化大模型服务。内容涵盖从获取GGUF格式模型文件、手动安装Ollama、编写核心Modelfile配置文件,到创建运行模型、性能调优及安全加固的全流程实战指南,旨在帮助企业安全、可控地构建内部AI能力。

weixin_29209805的博客 213

Qt6.5.1+WebRTC学习笔记(十二)环境搭建流媒体服务器(ubuntu22.04+SRS)

若只是实现一对一通信,仅使用webrtc就足够了。但有时间需要进行多个人的直播会议,当人比较多时,建议使用一个流媒体服务器,笔者使用的是SRS。这个开源项目资料比较全,笔者仅在此记录下搭建过程。

aggs1990的专栏 3362

极客时间-排序-基数排序(给100个手机号排序)

“基数排序对要排序的数据是有要求的,需要可以分割出独立的“位”来比较,而且位之间有递进的关系,如果 a 数据的高位比 b 数据大,那剩下的低位就不用比较了。除此之外,每一位的数据范围不能太大,要可以用线性排序算法来排序,否则,基数排序的时间复杂度就无法做到 O(n) 了。” package data.sort.line; public class CardinalitySort { public static String[] countSort(String b[],int index) {

哦绝影 981

Mamba vs YOLO:目标检测选型指南(附实际项目对比)

本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。

weixin_29062255的博客 367

如何用python排序并只输出前几个_如何对100万个数字进行排序,并且只在Python中打印前10个?...

我有一个有一百万个号码的文件。我需要知道我如何能有效地分类,这样它就不会让电脑死机,而且只打印前十名。#!/usr/bin/python3#Find the 10 largest integers#Don't store the whole listimport sysdef fOpen(fname):try:fd = open(fname,"r")except:print("Couldn't o...

weixin_39911916的博客 1474

微信小程序消息推送实战:从模板消息到订阅消息的进阶指南

本文详细解析了微信小程序消息推送的核心机制,重点对比了模板消息与订阅消息的差异与应用场景。模板消息适用于支付成功等强即时性业务回执,而订阅消息则需用户授权,更适合物流提醒等可预期通知。文章提供了从授权、配置到发送的完整实战指南,并分享了常见的避坑技巧与性能优化建议,帮助开发者构建高效、合规的用户触达体系。

weixin_29231027的博客 592

智能家居DIY:用51单片机实现三合一环境监测(温湿度+烟雾+自动灭火)

本文详细介绍了如何利用STC89C52单片机打造智能家居三合一环境监测系统,集成温湿度检测、烟雾报警和自动灭火功能。从硬件选型、电路设计到软件编程,提供完整的DIY方案,帮助读者构建高性价比的家庭安全防护系统,特别适合智能家居爱好者和电子DIY初学者。

yhn4567890的博客 689

使用位图解决电话号码排序问题--编程珠玑学习笔记 第一章

本文来源于《编程珠玑 第二版》第一章位图和位向量表示:用20位表示集合{2,3,5,6,10,13,19}为:01101100010010000010 电话号码排序问题:输入:一个文件,有n个整数,没个整数要小于n,无重复输出:以升序排序文件约束:可用内存1MB,时限10s算法://phase 1: initialize set to emptyfor i=

itegel的专栏 2161

2023年美高赛HiMCM:A题蒲公英 思路

蒲公英,通常称为蒲公英,是一种原产于欧亚大陆的植物,现在在世界各地都可以找到[1]。这种植物很容易通过其亮黄色的花朵(图1)和独特的“马勃”种子头(图2)来识别。该头部的每颗种子都附着在一个类似降落伞的结构上,称为“冠毛”,有利于风的传播[2]。如果处于“马勃”阶段的单个蒲公英毗邻一块开阔的一公顷土地,请创建一个数学模型来预测蒲公英在 1、2、3、6 和 12个月内的传播情况。确保您的模型考虑了各种气候条件(例如温带、干旱和热带气候)对蒲公英生长的影响。2. 蒲 公英、人类和其他植物之间的关系很复杂。

斌擎科技 7402

《编程珠玑》摘要

对《编程珠玑》这本书的一些摘要

DaDianJiShiQi的博客 1286

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式

WW、forever的博客 1078

raw (R/G, B/G) 色度域从白点筛选到 mired 直方图的完整构建流程

raw 域用draw​δraw​筛出白点后,。,与 CIE uv 域流程逐步对应。

大熊 36

编程珠玑: 电话号码排序

      算法、数据结构一直是自已薄弱的环节,一直想学习但觉得自己水平太臭,怕打击信心.平时工作中也只是会用库中的函数或类来解决问题。      逛书店无意间找到编程珠玑II,看了看目录感觉像小故事一样的来讲解算法,一下子就有了兴趣。俺们一比较喜欢的轻松一类的书籍比如: 《大话设计模式》、 《走出软件作坊》、《head first》系列( 好是好就是有点贵呀!) 。      带回家后看

奎特尔星球 3028

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【读薄《编程珠玑》】壹 开篇

这篇文章是《读薄<编程珠玑>》系列博客的第一篇,在这篇文章中,我总结了在书中出现的一些问题以及一些解决方案。 问题集合 0x01:一个最多包含n个正整数的文件,每个数都小于n,其中n=107,并且没有重复。最多有1MB内存可用。要求用最快方式将它们排序并按升序输出 0x02:使用位逻辑运算来实现位向量 0x03:尽可能快的生成位于 0~n-1 之间的 k 个随机不同顺序的整数 0x04:如果在问题0

远航 | FIBOS.io 4214

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

编程珠玑(一)位图

这个问题是编程之美中第一章开篇提到的问题,bitmap排序。大概意思是这样的,要对n个不重复的整数进行排序,每个数小于n(10的7次方)要求内存1M。其实是区号为800开始的电话号码,800不算在内。这个是典型的位图(bitmap,应该是位映射我觉得,估计是好翻译才把map翻译成图的)。下面是代码: #include using namespace std; const int NUM

胜利者的经验并不复杂,那就是寻找人生的关键点,并在关键时刻竭尽全力 1956

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

编程珠玑_第一章_ 开篇

问题: 输入:给出至多10,000,000个正整数的序列 特征:每个数都小于10,000,000、数据不重复 且 数据之间不存在关联关系(相互独立) 输出:增序输出序列 约束:内存容量1MB,磁盘空间充足,运行时间至多几分钟,10是最适宜的时间 分析:我们需要10,000,000个数表示10,000,000个位。1MB的包含8*1024*1024个位 则,所需要的内存容量为:10,00

思考,思考,再思考~ 1633

位图排序原理及C语言实现(源于《编程珠玑》)

<br />在《编程珠玑》的第一章,就是相当的精彩,这个位图排序就是出自那里。书中讲到的位图排序非常的巧妙(时间和空间都时非常的节省),而这巧妙是来源于对实际问题和数据的透彻分析,然后选取了一种高效的解决方案 。结合网上的一些资料以及自己的程序实现来简单记录一下吧。<br />1.位图的理解<br />我 们都明白图形格式中位图储存方式,其实就是以象素为单位的小方块,一格一格的纵横累积起来. 每一个小方块代表一种颜色,当然,如果对于黑白的二色图来说更加简单,只需要一个bit位即可表示. 这和我们

托雷斯基的专栏 2671

《编程珠玑》笔记一

编程珠玑笔记 第一章开篇 友好的对话 在别人不会问问题时,引导他去问问题也是一个很大的学问,Jon与一个程序员问的问题而展开。 问题:如何将1千万条记录排序?(都是七位的电话号码)最好是将时间控制在十秒钟左右,如果不行,几分钟也可以,但是不能超过十分钟,同时不可超过一兆的内存。 Jon先生要求我思考一分钟,并给他一个答案。我的答案有两个,一是使用链表的方式,运用插入排序的方法,二是使...

张念磊的博客 593

编程珠玑读书笔记--第一章 海量数据排序问题

海量数据排序问题:文件包含1千万条电话号码记录(10**7次方),每条记录都是7位整数,没有重复的整数。要求对文件进行排序,注意大约只有1MB的内存空间可用,有充足的磁盘存储空间可用。请设计一个高效的算法。   (1)运用多趟算法:如果每个号码都使用32位整数来表示,则在1MB

JRH的专栏 1362

《编程珠玑》第一章笔记

文章从一个实际的问题开始:一个电话系统,7位数的电话号码,用1MB的内存空间将这些电话号码排序。 分析:如果将这些电话号码看成int类型的整数,将其读入内存中进行排序,int类型4个字节,最多有10000000个电话号码,则需要40MB的内存空间,远远超出题目的要求,但是这10

whosemario的专栏 1048

编程珠玑 第一章 问题以及分析解答

 编程珠玑的开篇就是讲了如何对大数据量的数据进行排序问题 - 比如 1000w的数的排序问题(美国的电话号码)作者给出了以下思路1)合并排序 -也就是将数据都进来之后2)多输入排序3)位图排序问题如下:1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合? Answer: java.utils.Array 提供了对简单数据类型的排

iamdll的专栏 1541

c语言位图原理,位图排序原理及C语言实现(源于《编程珠玑》)

在《编程珠玑》的第一章,就是相当的精彩,这个位图排序就是出自那里。书中讲到的位图排序非常的巧妙(时间和空间都时非常的节省),而这巧妙是来源于对实际问题和数据的透彻分析,然后选取了一种高效的解决方案 。结合网上的一些资料以及自己的程序实现来简单记录一下吧。 1.位图的理解 我 们都明白图形格式中位图储存方式,其实就是以象素为单位的小方块,一格一格的纵横累积起来. 每一个小方块代表一种颜色,当然,...

weixin_42433412的博客 571
上一篇: 典型字符串匹配算法实现
下一篇: 【编程珠玑】第七章粗略估计
jimye
博客等级 码龄17年 260粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值