<编程珠玑>笔记(二) 三个算法

在第二章里,作者提出了三个问题,然后慢慢引出对应的算法实现。

1  Binary search 二分查找

Given a sequential file that contain at most 4x109 32-bit integers in random order, find a 32-bit integer that is not in the file.

How would you solve this problem with ample main memory?

How would you solve it if you could use several external "scratch" files but only a few hundred bytes of main memory?

1)  bitmap technique

With ample main memory, we could use the bitmap technique and dedicate 232 8-bit bytes to a bitmap representing the integers.

2)  binary search

     

The insight is that we can probe a range by counting the elements above and below its midpoint: either the upper or the lower range has at most half the elements in the total range. Because the total range has a missing element, the smaller half must also have a missing element.

Its only drawback is that the entire table must be known and sorted in advance.

2  Rotate -> reverse

Rotate a one-dimensional vector x of n elements left by i positions. For instance, with n=8 and i=3, the vector abcdefgh is rotated into defghabc.

Can you rotate the vector in time proportional to n using only a few dozen extra bytes of storage?

1) time and space constraints

space-expensive -- copy the first i elementsto a temporary array, move the remaining (n-i) elements left i places, and then copy the first i from the temporary array back to the last position in x.

  time-expensive -- define a function to rotate x left one position(in time proportional to n) and call it times.

2) delicate juggling act

move x[0] to the temporary t, then move x[i] to x[0], x[2i] to x[i], and so on, until we come back to taking an element from x[0], at which point we instead take the element from t and stop the process.

When i is 3 and n is 12, that phase moves the elements in this order. If that process did not move all the elements, then we start over at x[1], and continue until we move all the elements.

3) revese

starting with ab, we reverse a to get arb, reverse b to get arbr, and then reverse the whole thing to get (arbr)r, which is exactly ba

reverse(0, i-1)    // cbadefgh
reverse(i, n-1)    // cbahgfed
reverse(0, n-1)    // defghabc

3  Signatures

Given a dictionary of English words, find all sets of anagram.

For instance, "pots", "stop" and "tops" are all anagrams of each other.

时间: 2024-10-03 15:01:34

<编程珠玑>笔记(二) 三个算法的相关文章

&lt;编程珠玑&gt;笔记(二) 程序验证

在芯片设计(IC)领域有专门的职位叫做芯片验证工程师,其中的一种方法叫形式验证(Formal Verification),具体包括等价性检查,模型检查和定理证明. 本章所讲的程序验证方法(不要与软件测试混为一谈),与芯片行业的形式验证法非常相似.参考芯片行业,随着分工的细化,软件也会有专门的验证工程师. 1  Binary search determine whether the sorted array x[0..n-1] contains the target element t mustb

&lt;编程珠玑&gt;笔记(三) 四条原则

第三章作者重在阐述一种编程观念, 即 “data does indeed strcture programs” 这一章貌似没什么干货,只好把作者的几个例子贴出来,反复看看了. 1  A survey program   Total US Citi Perm Visa Temp Visa Male Female African American 1289 1239 17 2 684 593 Mexican American 675 577 80 11 448 219 Native American

《Linux系统编程》笔记 第三章(二)

3.6 定位流 标准库提供了与系统调用lseek()类似的函数来定位流中的读写位置. #include <stdio.h> int fseek (FILE *stream, long offset, int whence); long ftell(FILE *stream); 与lseek()用法类似,whence提供了如下选择: SEEK_CUR-将流的读写位置设置为当前位置加上pos个字节,pos可以是正数或负数. SEEK_END-将流的读写位置设置为文件尾加上pos个字节,pos可以是

Shader编程学习笔记(三)——三大主流编程语言 HLSL/GLSL/Cg

三大主流编程语言 HLSL/GLSL/Cg Shader Language Shader Language的发展方向是设计出在便携性方面可以和C++.Java等相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”同时“利用图形硬件的并行性,提高算法效率”. Shader Language目前主要有3种语言:基于OpenGL的OpenGL Shading Language,简称GLSL;基于DirectX的High Level Shading Language,简称HLS

java 编程思想笔记(三)——类的复用

一:复用功能介绍 复用代码,除了对代码复制并加以改变是不够的,除此之外,还能够使用类而不破坏现有程序代码. java 中代码复用可以分为以下三类:组合,继承,代理. 二:组合 新的类中使用现有类的对象,新的类由现有类的对象组成. 三:继承 通过extends 语法来实现声明. 四:代理 java 对代理没有提供直接支持,但通过组合和继承完成了间接实现,代理是组合和继承的中庸之道.代理=继承+组合 具体理解可以参考相关代码! 五:基类方法被子类重载 子类重载父类的方法,不会屏蔽其在基类中的任何版本

《编程珠玑》第三部分总结

第三部分讲的是产品,利用前两部分的材料创建出了有趣的程序. 第11章讲述了几个一般用途的排序算法,如插入排序.简单快速排序.更好的快速排序等. 第12章介绍了一个来自实际应用的特定问题(抽样问题),展示了用几种不同的方法解决这个问题. 第13章介绍一种方法及将产生随机数看成是集合表示中的一个问题,涉及到查找问题,通过接口及线性结构等进行程序的优化. 第14章介绍了数据结构,展示了如何为排序优先队列获得高效的算法,重点介绍堆这个数据结构解决问题. 第15章解决了在非常长的文本字符串中查找单词或词组

机器学习实战读书笔记(二)k-近邻算法

knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法:不适用 5.测试算法:计算正确率 6.使用算法:需要输入样本和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理. 2.1.1 导入数据 operator是排序时要用的 from numpy import * import operato

Unix环境高级编程学习笔记(三):标准I/O , 系统数据文件和信息

1 标准I/O函数不同于read,write函数,是其在流上进行操作, 当首次调用标准I/O函数时,系统会首先调用malloc,为流创造缓冲区, 2 fopen函数 #include<stdio.h> file * fopen(const char* pathname, const char * restrict name); 打开返回指针,出错返回NULL, type的取指有r(读),w(写),a(追加),r+/w+(读+写),a+(读+写+追加) int fclose(file* fp)

FFmpeg编程学习笔记二:音频重采样

ffmpeg实现音频重采样的核心函数swr_convert功能非常强大,可是ffmpeg文档对它的注释太过简单,在应用中往往会出这样那样的问题,其实在读取数据->重采样->编码数据的循环中在第一次执行swr_convert后还应用swr_convert再作个缓存检测看看是否还有数据,如果有就要把它写到FIFO中去,留在下次再使用,这点在转码和由低向高转换采样率时特别重要. 下面一段简单的代码,摘自我自已写的测试程序. const int frame_size = FFMIN(fifo_size