2 Egg Problem

破解两枚鸡蛋的最高坠落楼层数问题
本文详细解析了两枚鸡蛋问题的解决策略,通过数学建模和动态规划方法,找到了最少尝试次数的解决方案。利用等差数列原理,计算出了最优的尝试楼层序列,从而在保证鸡蛋安全的前提下,最大化地减少了尝试次数。

2 Egg Problem

 继续我们的推理问题之旅,今天我们要对付的是一个Google的面试题:Two Egg Problem.

我们开始吧! 

No.2  Google Interview Puzzle : 2 Egg Problem

* You are given 2 eggs.

* You have access to a 100-storey building.

* Eggs can be very hard or very fragile means it may break if dropped from the first floor or may not even break if dropped from 100th floor. Both eggs are identical.

* You need to figure out the highest floor of a 100-storey building an egg can be dropped without breaking.

Now the question is how many drops you need to make. You are allowed to break 2 eggs in the process

 

分析与解答:

   

     题目要求试的最大次数最小。首先,讨论两个比较trivial的方案。

 

   方案1:从第一层开始扔鸡蛋,如果鸡蛋不碎,则上一层再扔。这样,如果鸡蛋在某一层碎的话,该层就是临界的层。这种方案的优点在于省鸡蛋,只会摔破一个鸡蛋。还有一个鸡蛋可以带回家,做个鸡蛋羹,补充营养个!  :) 缺点就是,如果鸡蛋在100层才碎的话,那就要试100次啦。那你等电梯要等死啦,而且还要接受别人的打量的目光,心说这怪咖为什么每次都只坐一层楼啊…

 

  方案2 想必很多人都会想到这个方案。我只能说,这是中国计算机教育的成功啊。这就是“二分查找法”。首先在第50层楼扔鸡蛋,如果鸡蛋不碎的话,就去75楼。如果碎了的话,那么对不起,同志。由于你只剩一个鸡蛋了,所以你得小心地从第一层开始,这样才能保证你在鸡蛋碎完的时候能找到临界楼层。这种方法的优势在于,如果你知道你的鸡蛋比较硬的话,你就采用这个方法吧。临界楼层越高,这个方法尝试的次数越小。但这种优势是用临界楼层比较小时比较大的尝试次数为代价获得的。我们看到,如果临界层数在49层的话,我们要尝试50次,而临界层数为100层的时候,尝试次数只有7次。但是,现在的问题是,全部情况下的最大尝试次数最小。这样,虽然在某些情况下,这种方法的性能很好。但是就最差情况而言,还是要尝试50次,好像还是有点大。这边,我们想起来,“二分查找法”的目标是平均性能最佳,并不是最差性能最佳。我们似乎走错了路!!!不过,方案二相比方案一来讲还是有进步的。

 

  方案2似乎陷入了“短板效应”的泥沼,由于最坏情况下的坏性能制约了总体性能的提高。解决这个问题的总的原则应是:“一碗水端平”,尽量做到各种情况下的尝试次数尽量差不多。这正应合GOOGLE的信条Don't be evil,不以别的情况为代价换取另一些情况的指标的提高。做到“不伤害”.(呵呵,这是我瞎联想的)。那么,就照着这条路走吧,我假设每种情况下最大的尝试次数为x.

  则第一次扔蛋的楼层应为x;

第二次扔蛋的楼层应为 x+(x-1);

   依次类推。

   从上面看到,每次我们增加的楼层都是前一次减1.我们所要保证的就是应该在增加的层数变成0之前到顶楼,所以有:

   x+(x-1)++1100

   这是一个等差数列,整理后有:

     x2+x-2000

发现x14

 

我们总结一下:

  第一次在14楼扔,如果碎了的话从一楼再开始扔;

否则在14+13=27层扔,如果碎了的话从15层开始扔;

否则在27+12=39层扔,如果碎了的话从28层开始扔;

……

这样,最大尝试次数为14次就行了。不信你试试。

 

最后,为了体现严谨性,给出本题的模型:

 

转移方程:

minNum[n ] = min(1 + max(i – 1, minNum[n-i])) for 1n

边界条件:

minNum[0] = 0; minNum[1] = 1

这里,n为楼层数,i为起始楼层数。

 

据说这是一个动态规划问题,我还没来得及仔细研究。其实,我的感觉是,很多理论最初的来源都是很朴素的真理,只是我们没学懂,所以把它们想复杂了。所以,很好的理论就这样不被大多数人所理解了。

 

参考文献:

1.       http://blog.youkuaiyun.com/TravelInHistory/archive/2006/12/07/1434098.aspx

2.       http://classic-puzzles.blogspot.com/2006/12/google-interview-puzzle-2-egg-problem.html

### 如何在 Electron-Egg 中实现自动更新功能 Electron-Egg 是一个基于 Electron 和 Egg.js 的开发框架,支持快速构建跨平台的企业级桌面软件[^3]。为了实现在该框架中的自动更新功能,可以通过集成 `electron-updater` 或类似的工具来完成。 以下是关于如何在 Electron-Egg 项目中实现自动更新的具体方法: #### 使用 electron-builder 配置自动更新 `electron-builder` 提供了一个内置模块 `electron-updater`,它能够轻松处理应用的自动更新逻辑。以下是一些关键配置和代码示例: 1. **安装依赖** 安装必要的包以支持自动更新功能: ```bash npm install --save-dev electron-builder @electron/remote ``` 2. **修改 package.json 文件** 在项目的 `package.json` 文件中添加或调整如下字段: ```json { "build": { "appId": "com.example.electron-egg", "publish": [ { "provider": "github", "owner": "your-github-owner", "repo": "your-repo-name" } ], "mac": { "category": "public.app-category.productivity" }, "win": { "target": ["nsis"] }, "linux": { "target": ["AppImage", "deb"] } } } ``` 上述配置指定了发布渠道为 GitHub,并定义了不同操作系统的打包目标[^4]。 3. **创建更新管理器** 在主进程中引入并初始化 `autoUpdater` 模块: ```javascript const { autoUpdater } = require('electron-updater'); function initAutoUpdate() { autoUpdater.on('checking-for-update', () => { console.log('Checking for update...'); }); autoUpdater.on('update-available', (info) => { console.log('Update available:', info); }); autoUpdater.on('update-not-available', (info) => { console.log('No updates are available.', info); }); autoUpdater.on('error', (err) => { console.error('There was a problem updating the application:', err); }); autoUpdater.on('download-progress', (progressObj) => { let log_message = `Download speed: ${progressObj.bytesPerSecond} - Downloaded ${progressObj.percent}% (${progressObj.transferred}/${progressObj.total})`; console.log(log_message); }); autoUpdater.on('update-downloaded', (info) => { autoUpdater.quitAndInstall(); }); // 设置更新服务器地址 autoUpdater.setFeedURL({ provider: 'github', owner: 'your-github-owner', repo: 'your-repo-name' }); // 执行检查更新 autoUpdater.checkForUpdates(); } module.exports = { initAutoUpdate }; ``` 4. **调用更新函数** 将上述函数挂载到主进程启动时执行: ```javascript const path = require('path'); const { app } = require('electron'); const { initAutoUpdate } = require(path.join(__dirname, './updater')); app.whenReady().then(() => { initAutoUpdate(); }); ``` 以上步骤展示了如何利用 `electron-updater` 来实现自动更新的功能。 --- ### 注意事项 - 确保已正确设置 CI/CD 流程以便于自动化上传新版本的应用程序文件至指定仓库。 - 如果使用私有存储库,则需额外提供访问令牌或其他认证机制给 updater 工具使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值