场景题/智力题/概率题

来自网络上到处收集

文章目录

在弱网环境下,如何确保一个http请求发送成功/如何提高http连接成功率?

弱网环境存在的问题:

丢包、错包、乱包。
高延迟:响应数据回来时间长,甚至大于客户端等待时间
带宽小:每次能够通信的内容较少,数据包越大受影响可能越大
网络断续:网络经常断开又连接

弱网下优化处理:
参考:弱网环境下的网络性能调优 - 红嘴鲤鱼 - 博客园

1、采用TCP协议、实现长连接
2、采用长连接池,节省握手时间
3、采用ProtocolBuffer,减少冗余数据
4、弃用DNS,直接使用IP,减少了请求DNS服务查询IP的时间,避免被DNS劫持
5、加入重试机制,提供成功率
6、使用Http 2.0,压缩头部、长连接更加彻底、支持推送、支持(Multiplexing:支持一个TCP连接上同时实现多个请求和响应)
7、超时时间设置可以适当延长(限制放宽一点)

参考:在弱网环境下HTTPS比起HTTP来是否会让移动应用的体验显著变差? - 知乎

可以将https切换为http:
在这里插入图片描述

参考:弱网环境下如何优化网络请求_free_android的博客-CSDN博客

1、 前后端采用gzip方式请求和响应

前端在请求header添加:“content-encoding” 为 “gzip”,后端也要开启gzip,才能生效。

相比不采用gzip的请求方式,能节省流量,可以快速响应。

参考:弱网搭建及模拟工具,弱网或无网状态下 App的优化,弱网优化,网络优化(DNS/HttpDNS)_ShareUs的专栏-CSDN博客

1、断线重连。这可能是最重的一个特性,因为在无线网络中有太多的原因导致数据连接中断了。这里可以使用CDN。(CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。)
2、由于创建连接是一个非常昂贵的操作,所以应尽量减少数据连接的创建次数,且在一次请求中应尽量以批量的方式执行任务。如果多次发送小数据包,应该尽量保证在2秒以内发送出去。在短时间内访问不同服务器时,尽可能地复用无线连接
3、优化DNS查询。应尽量减少DNS查询、避免域名劫持、DNS污染,同时把用户调度到“最优接入点”。
4、减小数据包大小和优化包量。通过压缩、精简包头、消息合并等方式,来减小数据包大小和包量
5、控制数据包大小不超过1500,避免分片。包括逻辑链路控制(Logic Link Control)分片、GGSN分片,以及IP分片。其中,当数据包大小超出GGSN所允许的最大大小时,GGSN的处理方式有以下三种:分片、丢弃和拒绝。
6、优化TCP socket参数,包括:是否关闭快速回收、初始RTO、初始拥塞窗口、socket缓存大小、Delay-ACK、Selective-ACK、TCP_CORK、拥塞算法(westwood/TLP/cubic)等。做这件事情的意义在于:由于2G/3G/4G/WIFI/公司内网等接入网络的QoS差异很大,所以不同网络下为了取得较好的服务质量,上述参数的取值差异可能会很大。
7、优化ACK包。在弱网络的情况下,TCP协议中的ACK包是非常昂贵的,延时甚至能够达到秒级别,而TCP协议的拥塞控制、快速重传、快速恢复等特性都非常依赖接收端反馈的ACK包。可想而知,如果发送端接收到的ACK包延时太长,会严重影响TCP协议的效率。但是如果发送ACK太多又会占用宝贵过多的无线资源。在移动网络下通信,“在可靠的连接上,如何在减少ACK包的情况下,降低数据包的延时”是研究的热点。基本的思想:平衡冗余包和ACK包个数,达到降低延时,提高吞吐量的目的。

app如何精准校时(客户端的时间如何与服务端的时间进行较准?)

客户端与服务器端时间校准_Jason Wang-CSDN博客

1、服务器端永远使用UTC时间,包括参数和返回值,不要使用Date格式,而是使用UTC时间1970年1月1日的差值,即long类型的长整数。
2、APP端将服务器返回的long型时间转换为GMT8时区的时间,额外加上8小时,这样就保证了无论使用者在哪个时区,他们看到的时间都是同一个时间,也就是GMT8的时间。
3、APP本地时间会不准,少则差几分钟,多则十几分钟,要解决这个问题,我们可以使用HTTP Response头的Date属性,每次调用服务器接口时就取出HTTP Response头的Date值,转换为GMT时间,再减去本地取出的时间,得到一个差值d,我们将这个差值d保存下来。每次获取本地时间的时候,额外加上这个差值d,就得到了服务器的GMT8时间,就保证了任何人看见的时间都是一样的。

或者:
如何计算游戏客户端与服务器之间的时间延迟?_huangquanxi的专栏-CSDN博客

计算客户端与服务器之间的时间延迟:

1)客户端A先记录自己的本地时间TA1,然后给服务器发B发送一个报文。

2)服务器B收到报文之后,记录自己的本地时间TB,然后把TB放入报文里发送给客户端A。

3)客户端A收到信息之后,记录下收到报文的时间TA2.

由于报文往返的时间基本是相等的,所以客户端发送给服务器的时间延迟P = (TA2 - TA1)/ 2。一般延迟P只计算一次是不够精确的,可以让客户端A定时的给服务器B发送测量信息,然后计算P的平均值。

如果我们想要知道客户端和服务器的本地时间差,可以怎么获取呢?

也可以通过公式计算出来:

先假设A和B的本地时钟是一样的(当然这个假设明显不成立),那么TB = TA1 + P ,把上面的P套入公式,整理后可以得TB = (TA1 + TB2) / 2,可是实际上A和B之间是有时间差X的,于是 TB + X = (TA1 + TB2)/ 2,整理后可得X = (TA1 + TB2)/ 2 - TB。

一个app在启动的时候有很多模块要加载,一个模型就要使用一个线程,怎样限制线程的最大使用数量?

设置一个信号量作为最大线程并发数,通过PV操作来同步和限制每个时刻的线程并发数。

两根不均匀的香,1小时烧完,怎么得到15分钟

1、同时点上其中一根香的两头,另一根只点一头;

2、当点两头那根香燃完时,时间过去半小时,另一根香剩下的可以燃半小时,再点上它的另一头(开始计时);

3、当这根香燃完时,时间为15分钟。

门外3个开关,门内三盏灯,门外看不到门内的状况,只能进去一次,怎么确定所以开关对应哪个灯?

假如有K1、K2、K3三个开关,先打开K1、K2等一段时间后, 关掉K2。
然后进门,这时有一个亮着的灯就是K1控制,再有手去摸下不亮的两个灯,有发热的就是K2控制,不热的就是K3控制。

甲乙轮流抛硬币,正面胜,先抛的人优势多大?

甲乙轮流抛硬币,正面胜,先抛的人优势多大? - 知乎
在这里插入图片描述
如果是三个人呢?

在这里插入图片描述

n个点随机分布在圆上,问分布这些点都分布在同一半圆的概率。

用直径划半圆。

这个问题等价于“在一个圆环上随机取 n 个点,它们在同一个半圆弧的概率是多少”。

在这里插入图片描述

其实上面的思路还是很难理解,两道概率题求解(半原创)_beta-CSDN博客,这儿的思路很直接,而且给出了证明。

用O表圆心,从投下的n个点中,任取一个点作起点,顺时针方向进行编号为 P 1 , P 2 , . . . , P n P1,P2,. . . ,Pn P1P2...Pn ,过 P 1 , P 2... P n P1,P2 . . . Pn P1P2...Pn作n条半径,用 X 1 , X 2 , . . . , X n X1,X2,. . . ,Xn X1X2...Xn表相应的圆心角的值(X1代表P1、P2之间的圆心角,首尾相连)。

易知:

X 1 , X 2 , . . . , X n > = 0 X1,X2,. . . ,Xn >= 0 X1X2...Xn>=0,且: X 1 + X 2 + . . . + X n = 36 0 o X1 + X2 + . . . + X n = 360^o X1+X2+...+Xn=360o (1)

从(1)易知:P1,P2,. . . ,Pn, 同在一个半圆上, 当且仅当(1)式中 有一个 X i > 18 0 o ( i = 1 , 2 , . . . , n ) Xi> 180^o(i = 1 ,2,. . .,n ) Xi>180oi=12...n,如下图中的角3大于180度。
在这里插入图片描述

先考虑 X 1 > 18 0 o X1 > 180^o X1>180o的概率,为此过P1作直径P1OP,易知此时 P 2 , P 3 , . . . P n P2,P3,. . . Pn P2P3...Pn 都落在顺时针方向的半圆弧 P 1 P P1P P1P上,显然,此事件的概率是 1 / 2 n − 1 1/2^{n-1} 1/2n1 (每个点落在P1P的概率都是1/2,n-1个点相乘);
在这里插入图片描述

再考虑 X 1 > 18 0 o X1 > 180^o X1>180o的概率, 过P2作直径P2OP,易知,此时 P 3 , P 4 , . . . , P n , P 1 P3,P4,. . . ,Pn,P1 P3P4...Pn,P1 都落在顺时针方向的半圆弧POP2上,同样,此事件的概率也是 1 / 2 n − 1 1/2^{n-1} 1/2n1
. . .
. . .
最后,考虑 X n > 18 0 o Xn > 180^o Xn>180o的概率,过Pn作直径PnOP,易知,此时 P 1 , P 2 , . . . P n − 1 P1,P2,. . .Pn-1 P1P2...Pn1都落在顺时针方向的半圆弧POPn上,此事件的概率也是 1 / 2 n − 1 1/2^{n-1} 1/2n1

注意到以上 n 个事件互不相容,(因不同的Xi ,Xj > 1/2,导致Xi = Xj = 1/2 ,且其它Xk = 0 ,这是0概率事件,可不考虑)。又注意到以上论证所得结论,与最先取哪一个点为P1无关。所以,n个点落在同一半圆上的总概率是 n / 2 n − 1 n/2^{n-1} n/2n1 。(利用概率的可加性)

进阶:
在这里插入图片描述

寻找大数组中位数问题

数组很大的话,有两种方法:

  • 快速排序的partition思路
  • 分块,桶排序

用两个栈模拟实现一个队列,其最大容量是多少?

用两个栈模拟实现一个队列,其最大容量是多少?_MissingDi的博客-CSDN博客

如何用两个栈模拟实现一个队列? 如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证队列的最大容量是多少?

分析:的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”。用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,入队时把元素按顺序压入两栈模拟的队列,出队时按入队的顺序出栈即可。

如下图,用容量为m(较大的)的栈作为存储空间,容量为n的栈作为输出缓冲区,先将入队的前n个元素push进存储空间栈
在这里插入图片描述
随后对存储空间栈中的每个元素进行出栈(pop)操作,继而压入(push)输出缓冲区栈,如下图所示
在这里插入图片描述
对于剩余入队的前n+1个元素,将他们压入存储空间栈,两个栈的状态如下图:
在这里插入图片描述
此时已经入队了2n+1个元素,若此时进行出队操作,先将输出缓冲区栈中的元素出栈(pop)并输出:Q1,Q2…Qn,再对存储空间栈中的n个元素进行出栈(pop)并压入输入缓冲区栈,状态图如下:
在这里插入图片描述
然后对存储空间栈进行一次出栈(pop)操作并输出:Qn+1,最后再对输出缓冲区栈中的所有元素进行出栈(pop)操作并输出Qn+2,Qn+2…Q2n+1,这样两个栈总的输出序列为符合队列“先进先出”的特性,模拟成功。

但是如果前面蓝字的操作不执行,即在已经入队了2n+1个元素的情况下,还要继续向队列中添加更多的元素,将无法满足按入队的顺序出队。

综上所述,两个栈所模拟的队列的最大容量为2n+1。

有8个相同的球,其中一个坏了。只能用天平称两次,怎样找出那个坏的球?球是里面坏了的。

分成3,3,2三堆球

第一次:3 VS 3:

  • 如果不平衡:轻的那堆分为1、1、1,再任意挑其中2球1 VS 1称第二次,即易知;

  • 如果平衡:则将剩余的2分为1、1,再称第二次,即易知。

赛马问题求前几名

【Google】25匹马的角逐 - 爪哇人 - ITeye博客

25个人,每5个人一个跑道,最少经过几次比赛,得到前三名:

第一步:25个人分成5组,每组5人,分别比赛,得出每组的第一名,并对第一名进行排序,为A1、B1、C1、D1、E1;

第二步:A1、B1、C1、D1、E1进行一次比赛,得出第一名,假设为A1,此时经过6轮比赛,得出第一名;

第三步: 找第二名第三名;首先第一步中D1、E1排除,同时排除对应组所有成员;剩A1、B1、C1三组;

第四步: 第二名可能人员是A2、B1; 第三名可能人员是A2、A3、B1、B2、 C1;

第五部: 综合第四步猜猜,A2、A3、B1、B2、C1进行一轮比赛,得出第二名第三名,此时总共经过7轮比赛。

随机游走问题:从原点出发走2n步之后回到起点的概率

一维随机游走

在这里插入图片描述
每次走一步,往左或者往右的概率都是1/2, 那么走了2n步之后,回到原点的概率是?

  • 首先走了2n步,而每一步都有两种走法(概率相同),那么总的走法数量是 2 2 n 2^{2n} 22n
  • 要想最后回到原点,那么一共向左走了n步,向右走了n步,也就是说在2n步里面挑选出n步向左走就可以了(剩下的n步自然就是向右),对应的方法数就是 C 2 n n C^{n}_{2n} C2nn

所以对应的概率就是:

C 2 n n / 2 2 n = C 2 n n ∗ ( 1 / 2 ) − 2 n C^{n}_{2n}/2^{2n} = C^{n}_{2n}*(1/2)^{-2n} C2nn/22n=C2nn(1/2)2n

二维随机游走

如果是二维的,也就是可以上下左右走,走每个方向的概率都是1/4,那么2n步之后能够返回原点的概率是?

参考:一个醉汉,向前后左右走的概率都是25%,走了2n步后回到原点的概率怎么算? - 知乎

分析方法是类似的,二维的话,假设向左走了t步,向右走了t步,向上走了n-t步,向下走了n-t步,t可以取0到n的任意一个整数。

对于某个固定的t,可能的走法有 ( 2 n ) ! t ! t ! ( n − t ) ! ( n − t ) ! \frac{(2 n) !}{t ! t !(n-t) !(n-t) !} t!t!(nt)!(nt)!(2n)! 种走法(对于这2n步任意排列,然后除以等价的排列数)。针对t求和:
N 2 n = ∑ t = 0 n ( 2 n ) ! t ! t ! ( n − t ) ! ( n − t ) ! = ( 2 n ) ! n ! n ! ∑ t = 0 n ( n t ) ( n n − t ) = ( 2 n n ) 2 N_{2 n}=\sum_{t=0}^{n} \frac{(2 n) !}{t ! t !(n-t) !(n-t) !}=\frac{(2 n) !}{n ! n !} \sum_{t=0}^{n}\left(\begin{array}{l}n \\ t\end{array}\right)\left(\begin{array}{c}n \\ n-t\end{array}\right)=\left(\begin{array}{c}2 n \\ n\end{array}\right)^{2} N2n=t=0nt!t!(nt)!(nt)!(2n)!=n!n!(2n)!t=0n(nt)(nnt)=(2nn)2
所以返回原点的概率是:

P 2 n = N 2 n 4 2 n = 1 1 6 n ( 2 n n ) 2 P_{2 n}=\frac{N_{2 n}}{4^{2 n}}=\frac{1}{16^{n}}\left(\begin{array}{c} 2 n \\ n \end{array}\right)^{2} P2n=42nN2n=16n1(2nn)2

此外:
在这里插入图片描述
上面公式的求和不是很容易理解。上面的链接下有一个很容易理解的方法,也即是高赞的第一个:

设第n步后的坐标是 ( X n , Y n ) \quad\left(X_{n}, Y_{n}\right) (Xn,Yn)。定义 Z n = X n + Y n , W n = X n − Y n , Z_{n}=X_{n}+Y_{n}, W_{n}=X_{n}-Y_{n}, Zn=Xn+Yn,Wn=XnYn, Z n Z_{n} Zn W n W_{n} Wn 为独立同分布的随机变量!并且它们每步都以概率1/2加1,以概 率1/2减1。换句话说, { Z n } n = 0 , 1 , … \left\{Z_{n}\right\}_{n=0,1, \ldots} {Zn}n=0,1, { W n } n = 0 , 1 , … \left\{W_{n}\right\}_{n=0,1, \ldots} {Wn}n=0,1, 是两个独立的一维对称随机游走!然后显然有 ( X 2 n , Y 2 n ) = ( 0 , 0 ) \left(X_{2 n}, Y_{2 n}\right)=(0,0) (X2n,Y2n)=(0,0) 当且仅当 ( Z 2 n , W 2 n ) = ( 0 , 0 ) , \left(Z_{2 n}, W_{2 n}\right)=(0,0), (Z2n,W2n)=(0,0), 所以要求的概率就是一维随机游走回原点的概率的平方。

一维的概率,是 ( 2 n n ) 2 − 2 n , \left(\begin{array}{c}2 n \\ n\end{array}\right) 2^{-2 n}, (2nn)22n, 那这个二维的概率就是 ( 2 n n ) 2 2 − 4 n \left(\begin{array}{c}2 n \\ n\end{array}\right)^{2} 2^{-4 n} (2nn)224n

至于为什么独立:

Δ Z n : = Z n − Z n − 1 \Delta Z_{n}:=Z_{n}-Z_{n-1} ΔZn:=ZnZn1 Δ W n : = W n − W n − 1 \Delta W_{n}:=W_{n}-W_{n-1} ΔWn:=WnWn1 分别为这两个过程从第n-1 步到第n步的增量。那么 ( Δ Z n , Δ W n ) \quad\left(\Delta Z_{n}, \Delta W_{n}\right) \quad (ΔZn,ΔWn) 一共就有四种可能的取值: (1,1),(1,-1),(-1,1) 和(-1,-1),它们分别对应碎汉往右走(X增加1)、往上走(Y增加1)、往下走(Y减小1) 和往左走(X减小1),因此框率各为1/4。所以 Δ Z n \Delta Z_{n} ΔZn Δ W n \Delta W_{n} ΔWn 是独立的。不同步之间的增量显然也都是独立的。因此 { Z n } n − 0 , 1 , … \left\{Z_{n}\right\}_{n-0,1, \ldots} {Zn}n0,1, { W n } n − 0 , 1 , … \left\{W_{n}\right\}_{n-0,1, \ldots} {Wn}n0,1, 作为两个随机过程也是独立的。

100个人,现在要两两配对成为50只队伍,如何保证公平?

公平的意思应该就是任何两个人被分到一起的概率都是一样的。那这个概率是多少呢?

可以看:一千人两两分组,特定两人分到同一组的概率该如何计算? - 知乎

概率应该是1/99。

在这里插入图片描述

糖果分组的思路:

提前统计总人数和要分成的组数,准备相应的糖果。糖果的总数和总人数相同,糖果的口味或种类需要和组数相匹配。比如100人要分成5组,则准备100颗糖果,包含5种口味或种类,每种糖果各20个。

所以这儿保证公平的话,就是50种糖,每种两颗。

那么定义一个数组大小为100,元素为1、1,2、2,3、3…49、49,50、50。使用打乱数组的思路LeetCode第 384 题:打乱数组(C++)_zj-CSDN博客,将数组打乱,最后数字相同的两个下标组合在一起就可以保证公平了。

小白鼠试毒问题

1000瓶药水,1瓶有毒药,最少几只小白鼠能够找出?

思路是使用二进制处理:

假设是3只小白鼠和8瓶:

000=0
001=1
010=2
011=3
100=4
101=5
110=6
111=7

每位(二进制位)数对应一只老鼠,0-7表示8个瓶子。将1,3,5,7(最右的二进制位为1)号瓶子的药混合取样给鼠1吃,2,3,6,7号瓶子混合取样给老鼠2吃……如鼠1死了,鼠2没死,鼠3死了,那么就是101=5号瓶子有毒。

N只老鼠的量程为 2 N 2^N 2N,1000只瓶子位于 2 9 2^9 29 2 10 2^{10} 210,10只小鼠可以测1000瓶。

如何判断一个数是否是2的n次方O(1)算法

当一个数为2的n 次方时,整个二进制数,只有本位是1 其他位为0,如果我们给这个数减一,那么本位变为0 其他位全部变成1。可以通过&运算, 如果为0即为2的n次方;

def is2n(self, n):
        if n == 0:
            return True
        res = n & (n-1)
        return res==0

或者直接通过:

return bitset<32>(n).count() == 1

就可以检测。

如何不新建第三个变量而交换a,b两个变量内的值

a=a+b;
b=a-b;
a=a-b;

有100个乒乓球,两个人,每个人每次只能拿[1, 5]个球,最后一次把球拿完的获胜,问怎么先手必胜?

根据以上分析,把100分成6个一组,余数是几,我就先拿几个

100÷6=16(组)…4(个)

先拿4个,他拿1~5中的n个,我拿6-n,依此类推,保证我能得到第100个乒乓球。

先手必胜类题目,leetcode上面有很多:
LeetCode第 292 题:Nim游戏(C++)_zj-CSDN博客

leetcode 第 1025 题:除数博弈(C++)_zj-CSDN博客

有2.5亿个数,其中只有一个数出现两次,其他的数都出现一次。在内存紧张的情况下,怎么找出这个重复数?

位运算:

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

typedef long long ll;
const int maxn = 1e5 + 10;

int n;
int a[maxn];

void found(){
	int xors = 0;
	for (int i = 0; i<n; i++){
		xors ^= a[i];
	}
	for (int i = 0; i<n; i++){
		xors ^= i;//注意这儿
	}
	printf("xors= %d\n", xors);
}

int main()
{
	cin >> n;
	for (int i = 0; i <= n; i++)
		cin >> a[i];
	found();
	return 0;
}

两层for循环,比如:
第一层异或:123345
第二层异或:12345
总的来说,只有3出现了3次,其他的都是两次

有点像LeetCode第 268 题:缺失数字(C++)_zj-CSDN博客

bitmap解决一道海量数据处理面试题:在2.5亿个整数中找出不重复的整数

采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。

出租车一分钟来的概率是p,三分钟来的概率是多少?

1-(1-p)^3

100层丢玻璃球–两个玻璃球怎么才能用最少次数求出来玻璃球破碎的临界值

问题:

有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。

那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层?

100层高的大楼,丢玻璃球的问题_其实我也有梦想-CSDN博客

这个解析说的挺好了。

知乎:有哪些令人拍案叫绝的算法? - 知乎
在这里插入图片描述
关键点在于均匀。

不均匀硬币产生等概率/均匀硬币产生非等概率问题

不均匀硬币产生等概率/均匀硬币产生非等概率_zj-CSDN博客

海盗分金币

挺有趣的问题

1、>= 半数:海盗分金币问题_鬼义虎神的学习笔记-CSDN博客
2、>半数:博弈论之五个海盗分金币的问题(以及推广到更多的海盗) - 简书

54张扑克牌,平均分成3份,大小王在一份的概率?

首先大王一定会在某一份中,然后要计算这一份中还要包含小王的概率。

去掉大王还剩53张牌,有大王的那份还可以分到17张牌,那么每次分到小王的概率是1/53,所以总概率是17/53。

计算:
在这里插入图片描述

设计一个微信发红包的api,你会怎么设计,不能有人领到的红包里面没钱,红包数值精确到分

(答案2)字节跳动算法题+智力题+场景题100题_笔经面经_牛客网

传入参数:总钱数,总份数,随机分/等分。

先判断总钱数能不能分那么多份,总钱数 >= 0.01*总份数

然后根据分发策略:

  • 随机分:1到总钱数 -(总份数-1)*0.01 的随机数(总钱数以分为单位)
  • 等分:直接判断能不能整除,有余数就将余数加到最后一份里面。

有一个IP地址库,假设有几十万条ip,如何判断某个ip地址是否在这个库中?

思路一:分治法,将ip地址根据前三位分成256份,然后看这个ip地址对应的网段,只比对这个网段里面是否有这个ip,当然还可以继续分下去,根据数据量来决定分成多少份。

思路二:位图,将每一条ip对应位图中的一个位,2^32次方(42亿多)个数据只需要512M空间。可以实现O(1)的时间搜索,O(n)的时间存储。

在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为 2G)

讲的很好,要理解为什么要64位:在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为 2G)_罗自荣_新浪博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值