「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
简介
今天也是小落叶复习的一天,今天给大家介绍有关埃及分数的例子。这个例子简单的了解一下有关贪心法的问题。
埃及分数
埃及同中国一样,也是世界文明古国之一。古埃及人只用分子为1的分数,在表示一个真分数时,将其分解为若干埃及分数之和,例如,7/8表示为1/2+1/3+1/24。埃及分数问题(Egypt fraction)要求把一个真分数表示为最少的埃及分数之和的形式。
想法
一个真分数的埃及分数表示不唯一的。例如,7/8又可以表示为1/8+1/8+1/8+1/8+1/8+1/8+1/8。显然,把一个真分数表示为最少的埃及分数之和的形式,其贪心策略是选择真分数包含的最大埃及分数。以7/8为例,7/8>1/2,则1/2是第一次贪心选择的结果;7/8-1/2=3/8>1/3,则1/3是第二次贪心选择的结果;7/8-1/2-1/3=1/24,则1/24是第三次贪心选择的结果,即7/8=1/2+1/3+1/24。
接下来的问题是:如何找到真分数包含的最大埃及分数?设真分数为A/B,B除以A的整数部分为C,余数为D,则有下式成立:
B=A*C+D
即
B/A=C+D/A<C+1
则
A/B>1/(C+1)
即1/(C+1)即为真分数A/B包含的最大埃及分数。设E=C+1,由于:
A/B-1/E=((AE)-B)/(BE)
则真分数减去最大埃及分数后,得到真分数((AE)-B)/(BE),该真分数可能存在公因子,需要化简,可以将分子和分母同时除以最大公约数。
算法
设函数EgyptFraction实现埃及分数问题,算法用伪代码描述如下:
埃及分数EgyptFraction
输入:真分数的分子A和分母B
输出:最少的埃及分数之和
1. E=B/A+1;
2. 输出1/E;
3. A=A*E-B; B=B*E;
4. 求A和B的最大公约数R,如果R不为1,则将A和B同时除以R;
5. 如果A等于1,则输出1/B,算法结束;否则转步骤1重复执行。
寄语
因为目前小落叶还是在复习,时间有限,所以在这里就简单的介绍一下有关埃及分数的内容,希望可以让大家对于贪心算法有一个简单的认识。