逻辑

一个半径为r的圆用多少半径为r/2的圆可以铺满

7个

解法:

要最少,则覆盖效率最高,在不剪碎的前提下讨论。
要完全覆盖,则必须完全覆盖大圆的圆周,于是小圆的利用率越高,与大圆交点截得的弦长越长。
令大圆与小圆交点截得的弦长最长即小圆直径。有弦长=R 则弦至圆心的距离为√3/2R>1/2R,所以中间不能完全覆盖,还要加一个。
所以单个小圆覆盖的角度为60°。即共需要6+1=7个小圆。

给定一个 [0, 1] 的均匀分布,求圆周率

用这个分布产生一个坐标 (x, y)(x,y),则这些点均匀分布在一个边长为 1 的正方形内,如下图所示。由几何概率可知,落在四分之一圆内的概率为$P = \frac{\pi}{4}$,因此我们只需统计出所有点里面落在圆内的点数即可估计出圆周率。

求长方形的面积

二维直角坐标系上,给定 N 个点的坐标( float 型),一个点 C 的坐标( float 型),一个整数 M 。问:找一个正方形,它以 C 点为中心,且四条边分别与 x 轴和 y 轴平行,其内部至少包含 N 个点中的 M 个点(在边上也算),问这样的正方形边长最小是多少?

分别求每个点到 c 点(x,y)的长度, 长度为 max((x0-x), (y0-y))

1TB硬盘数据32GB数据排序

1、外排序
传统的排序算法一般指内排序算法,针对的是数据可以一次全部载入内存中的情况。但是面对海量数据,即数据不可能一次全部载入内存,需要用到外排序的方法。外排序采用分块的方法(分而治之),首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序。然后采用归并排序的思想对于所有的块进行排序,得到所有数据的一个有序序列。

例如,考虑一个1G文件,可用内存100M的排序方法。首先将文件分成10个100M,并依次载入内存中进行排序,最后结果存入硬盘。得到的是10个分别排序的文件。接着从每个文件载入9M的数据到输入缓存区,输出缓存区大小为10M。对输入缓存区的数据进行归并排序,输出缓存区写满之后写在硬盘上,缓存区清空继续写接下来的数据。对于输入缓存区,当一个块的9M数据全部使用完,载入该块接下来的9M数据,一直到所有的9个块的所有数据都已经被载入到内存中被处理过。最后我们得到的是一个1G的排序好的存在硬盘上的文件。

2、1TB数据使用32GB内存如何排序
①、把磁盘上的1TB数据分割为40块(chunks),每份25GB。(注意,要留一些系统空间!)
②、顺序将每份25GB数据读入内存,使用quick sort算法排序。
③、把排序好的数据(也是25GB)存放回磁盘。
④、循环40次,现在,所有的40个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!)
⑤、从40个块中分别读取25G/40=0.625G入内存(40 input buffers)。
⑥、执行40路合并,并将合并结果临时存储于2GB 基于内存的输出缓冲区中。当缓冲区写满2GB时,写入硬盘上最终文件,并清空输出缓冲区;当40个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个0.625GB,直到全部处理完成。

3、继续优化
磁盘I/O通常是越少越好(最好完全没有),那么如何降低磁盘I/O操作呢?关键就在第5和第6步中的40路输入缓冲区,我们可以先做8路merge sort,把每8个块合并为1路,然后再做5-to-1的合并操作。
再深入思考一下,如果有多余的硬件,如何继续优化呢?有三个方向可以考虑:
使用并发:如多磁盘(并发I/O提高)、多线程、使用异步I/O、使用多台主机集群计算。
提升硬件性能:如更大内存、更高RPM的磁盘、升级为SSD、Flash、使用更多核的CPU。
提高软件性能:比如采用radix sort、压缩文件(提高I/O效率)等。


逻辑
https://flepeng.github.io/code-逻辑/
作者
Lepeng
发布于
2021年3月12日
许可协议