解v_JULY_v博客的面试题(慢慢做,慢慢更新)

分享最新面试题解答及思路

看到v_JULY_v博客(http://blog.youkuaiyun.com/v_july_v/article/details/6855788)里面的面试题

十月百度,阿里巴巴,迅雷搜狗最新面试十一题(每日更新中)

看了忍不住有点冲动,想把思路和大家分享一下,大家一起交流,

记得有句话,击打在石头上的浪花才会出现彩虹,所以我们不同思想的交流也能激起一道靓丽的彩虹!

1.十月百度:一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?

思路:只想到用坐标重新作为新数组的小标,把原先的数组的下标作为新数组的值,之后指定坐标直接用坐标索引(不过要要求指定坐标的              最大值要尽量的小)

          也可以先对数组以坐标值进行排序再插值吧。

2.百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。

思路:这个问题,理论上要确定那些数没有出现是要历遍的,问题是没有出现的数最少9千万过以上,所以太不划算的,所以我们要解决的是

          怎么保存这个不出现的数,而且可以省略去枚举这些不出现的数。

          下面我想到一种很省空间的标识方法,至于效率就不做深究了。

          首先,定义 一个结构体  struct tagArea{ long start, long end };

          然后对这1千万个随机数进行从小到大排序,之后从1开始 到排序后的数组比较  如果 当前数组比前一个数组大1以上 则保存到结构体

           即start赋予前一个数组的数 后面数组的数赋给 end  , 那么 没有出现的数就可以表示为(start,end)之间。

          类似 的 生成了 n个tagArea结构体,他们记录了 没有出项的数。

          另外一种方法是 用 二进制的每一bit表示那个数没有出现。 

4.搜狗:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描       述实现算法,并指出算法复杂度。

思路:只能想到二分法比较。。。。


### RNN 到 LSTM 的概念进化过程及其实现原理 #### 一、RNN 基本结构及其局限性 循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据的模型,其核心特点是隐藏层的状态会随着输入的时间步不断更新。然而,在实际应用中,标准的 RNN 存在一个显著的问题——梯度消失或爆炸现象[^1]。当尝试捕捉长时间依赖关系时,误差信号在反向传播过程中逐渐减弱甚至完全丢失,这使得 RNN 很难学习到距离较远的数据之间的关联。 #### 二、LSTM 设计初衷与改进之处 为了克服传统 RNN 中存在的长期依赖问题,Hochreiter & Schmidhuber 提出了长短期记忆网络(Long Short-Term Memory, LSTM)。相比普通的 RNN 结构,LSTM 引入了一个额外的记忆单元称为 **细胞状态** (cell state),并通过三个门控机制来控制信息流动:遗忘门(forget gate)、输入门(input gate)以及输出门(output gate)[^2]。这些设计允许模型选择性地保留重要历史信息或者丢弃无用的部分,从而有效缓了梯度消失带来的挑战。 #### 三、LSTM 工作流程析 以下是关于 LSTM 如何运作的一个简化描述: - **Forget Gate Layer**: 这一层决定哪些来自先前时刻的信息应该被舍弃掉。它接收当前输入 \(x_t\) 和上一时序隐藏状态 \(h_{t−1}\), 并通过 sigmoid 函数计算出一个介于0和1之间数值作为权重系数应用于旧有 cell content 上。 - **Input Gate Layer with tanh function**: 此处负责创建新的候选值 \(\tilde{C}_t\). 同样基于当前输入\(x_t\) 及前次隐含态 h(t − 1),先经由sigmoid函数判断需加入多少新资讯;再利用双曲正切激活函数生成潜在新增内容。 - **Cell State Update**: 将上述两部分结合起来完成最终 Cell Content 更新操作。\[ C_t=f*C_(t-1)+i*\tilde{C}_t \] - **Output Gate Layer**: 它决定了下一个隐藏状态 ht 应该是什么样子。首先再次运用 Sigmoid 层评估整个 Cell Status 能贡献多大比例给 Output Vector ,之后乘以前面提到过的 TanH(Cell Status )结果形成最后输出形式\[ o=\sigma(W_o[h_(t-1 ),X_t ]+b_o)\]\[ h_t=o*tanh(C_t)] 以上便是完整的单个时间片内的运算逻辑[^3]. #### 四、总结对比分析 相较于基础版本的 RNN 架构,LSTMs 显著增强了对于远程上下文敏感性的建模能力.尽管如此也付出了更多资源消耗方面的代价比如增加了参数规模等等.[^4].但是考虑到许多现实世界中的任务确实涉及到复杂的跨时段交互模式(如语音识别、机器翻译等领域),这种牺牲往往是值得接受的. ```python import numpy as np def lstm_cell(x_t,h_prev,c_prev,W_f,b_f,W_i,b_i,W_c,b_c,W_o,b_o): forget_gate = sigmoid(np.dot([h_prev,x_t],W_f.T)+b_f) input_gate = sigmoid(np.dot([h_prev,x_t],W_i.T)+b_i) candidate_value =np.tanh(np.dot([h_prev,x_t],W_c.T)+b_c ) c_next=forget_gate *c_prev +input_gate* candidate_value output_gate=sigmoid(np.dot([h_prev,x_t],W_o.T)+b_o) h_next=output_gate*np.tanh(c_next) return h_next ,c_next # Helper functions omitted here... ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值