貪心算法應用:埃及分數問題詳解

在這里插入圖片描述

貪心算法與埃及分數問題詳解

埃及分數(Egyptian Fractions)問題是數論中的經典問題,要求將一個真分數表示為互不相同的單位分數之和。本文將用2萬字全面解析貪心算法在埃及分數問題中的應用,涵蓋數學原理、算法設計、Java實現、優化策略及擴展應用。


一、埃及分數問題定義

1.1 基本概念

  • 單位分數:分子為1的正分數(如1/2、1/3)
  • 埃及分數表示:任何正有理數可表示為有限個不同單位分數之和
  • 數學定理:? a/b ∈ (0,1), ? 有限序列 {1/k?, 1/k?, …, 1/k?} 使得 a/b = Σ 1/k?

1.2 問題形式化
輸入:兩個正整數 a, b(滿足 0 < a < b)
輸出:一組互不相同的單位分數,使得它們的和等于 a/b

示例

7/8 = 1/2 + 1/3 + 1/24  
2/3 = 1/2 + 1/6  
5/6 = 1/2 + 1/3  

二、貪心算法策略與數學原理

2.1 貪心選擇策略
每次選擇滿足以下條件的最大單位分數:

  1. 1/k ≤ 當前剩余分數
  2. k 是滿足條件的最小正整數

數學推導
對于剩余分數 a’/b’,選擇:

k = ceil(b'/a')  

然后計算新剩余分數:

a'/b' - 1/k = (a'*k - b') / (b'*k)  

2.2 正確性證明

  1. 終止性:每次操作后分子嚴格遞減
    • 新分子:a’’ = a’*k - b’ < a’
  2. 正確性:通過數學歸納法可證明總能找到解

2.3 算法步驟

  1. 初始化剩余分數為 a/b
  2. 循環直到剩余分數為0:
    a. 計算當前最大單位分數 1/k
    b. 將 1/k 加入結果集
    c. 計算剩余分數 = 剩余分數 - 1/k
    d. 化簡剩余分數
  3. 返回結果集

三、基礎Java實現

3.1 核心代碼結構

import java.util.ArrayList;
import java.util.List;public class EgyptianFractions {// 計算最大公約數private static int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}// 分數化簡private static int[] reduceFraction(int a, int b) {int common = gcd(a, b);return new int[]{a / common, b / common};}// 貪心算法分解埃及分數public static List<String> getEgyptianFractions(int numerator, int denominator) {List<String> result = new ArrayList<>();while (numerator != 0) {// 計算當前k值int k = (int) Math.ceil((double) denominator / numerator);result.add("1/" + k);// 計算剩余分數: numerator/denominator - 1/kint newNumerator = numerator * k - denominator;int newDenominator = denominator * k;// 化簡分數int[] reduced = reduceFraction(newNumerator, newDenominator);numerator = reduced[0];denominator = reduced[1];}return result;}public static void main(String[] args) {List<String> egyptian = getEgyptianFractions(7, 8);System.out.println("7/8 = " + String.join(" + ", egyptian));// 輸出: 7/8 = 1/2 + 1/3 + 1/24}
}

3.2 代碼解析

  1. gcd函數:計算最大公約數用于分數化簡
  2. reduceFraction方法:將分數化為最簡形式
  3. 核心循環邏輯
    • 計算當前最大單位分數的分母k
    • 更新剩余分數分子分母
    • 化簡分數防止數值膨脹

3.3 時間復雜度分析

  • 最壞情況:O(n)(n為分解步數)
  • 每步計算:O(1)
  • 實際效率取決于輸入分數特性

四、高級實現與優化

4.1 防止整數溢出
使用長整型存儲中間結果:

public static List<String> getEgyptianFractionsSafe(int numerator, int denominator) {List<String> result = new ArrayList<>();long num = numerator;long den = denominator;while (num != 0) {long k = (den + num - 1) / num; // 避免浮點計算result.add("1/" + k);long newNum = num * k - den;long newDen = den * k;// 化簡long common = gcd(newNum, newDen);num = newNum / common;den = newDen / common;}return result;
}private static long gcd(long a, long b) {while (b != 0) {long temp = b;b = a % b;a = temp;}return a;
}

4.2 迭代代替遞歸
避免棧溢出風險:

public static List<String> getEgyptianFractionsIterative(int numerator, int denominator) {List<String> result = new ArrayList<>();int[] current = {numerator, denominator};while (current[0] != 0) {int a = current[0];int b = current[1];int k = (int) Math.ceil((double) b / a);result.add("1/" + k);int[] next = {a * k - b, b * k};int gcd = gcd(next[0], next[1]);current[0] = next[0] / gcd;current[1] = next[1] / gcd;}return result;
}

4.3 性能優化技巧

  1. 預計算加速:緩存常用分數分解
  2. 并行計算:多線程處理多個分數分解
  3. 符號處理:擴展支持負數分數

五、數學證明與實例分析

5.1 正確性證明
基例:當a=1時,直接返回1/b
歸納步驟:假設對a’ < a成立,則:

  1. 選擇k = ?b/a?
  2. 剩余分數 (ak - b)/(bk) 的分子 a’ = a*k - b < a
  3. 根據歸納假設,剩余分數可分解

5.2 實例推演
以7/8為例:

步驟1: k = ceil(8/7)=2 → 1/2  
剩余: 7/8 - 1/2 = 3/8  
步驟2: k = ceil(8/3)=3 → 1/3  
剩余: 3/8 - 1/3 = 1/24  
步驟3: k=24 → 1/24  
剩余: 0 → 終止  
結果: 1/2 + 1/3 + 1/24

5.3 算法局限性

  • 分解結果可能不是最短的埃及分數表示
    示例:5/121 貪心分解需要多步,存在更優解
  • 分母可能快速增長導致數值溢出

六、測試用例設計

6.1 基礎測試

@Test
void testBasicCases() {// 測試用例1: 7/8List<String> result1 = EgyptianFractions.getEgyptianFractions(7, 8);assertEquals(Arrays.asList("1/2", "1/3", "1/24"), result1);// 測試用例2: 2/3List<String> result2 = EgyptianFractions.getEgyptianFractions(2, 3);assertEquals(Arrays.asList("1/2", "1/6"), result2);
}

6.2 邊界測試

@Test
void testEdgeCases() {// 分子為1List<String> result3 = EgyptianFractions.getEgyptianFractions(1, 5);assertEquals(Collections.singletonList("1/5"), result3);// 大分母測試List<String> result4 = EgyptianFractions.getEgyptianFractions(1, 1000);assertEquals(Collections.singletonList("1/1000"), result4);
}

6.3 性能測試

@Test
void testPerformance() {long start = System.currentTimeMillis();EgyptianFractions.getEgyptianFractions(1234, 4321);long duration = System.currentTimeMillis() - start;assertTrue(duration < 100, "Time cost should be less than 100ms");
}

七、擴展應用與變種問題

7.1 最短埃及分數表示

  • 屬于NP難問題
  • 需結合回溯法或動態規劃
  • 示例:5/121 = 1/25 + 1/757 + 1/763309 + 1/8739601…(貪心法需要更多項)

7.2 現代應用場景

  1. 密碼學:在門限方案中分配秘密份額
  2. 資源分配:將總資源分解為多個獨立配額
  3. 數學教育:分數運算教學工具

7.3 多分子擴展
處理形如2/5的分解:

2/5 = 1/3 + 1/15  = 1/4 + 1/6 + 1/20  

八、與其他算法對比

8.1 貪心算法 vs 回溯法

特性貪心算法回溯法
時間復雜度O(n)指數級
結果質量非最優但快速可得最優解
內存消耗O(1)O(n)
適用場景快速近似解小規模精確解

8.2 貪心算法 vs 幾何方法

  • 幾何方法:基于斐波那契-西爾維斯特數列
  • 優勢:能產生更短的分解
  • 缺點:實現復雜度高

九、總結

9.1 改進方向

  • 結合啟發式搜索優化結果長度
  • 開發混合算法(貪心+動態規劃)
  • 擴展支持分數運算符號處理

更多資源:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文發表于【紀元A夢】!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

量化面試綠皮書:1. 海盜分金博弈

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 1. 海盜分金博弈 五個海盜搶走了一個裝滿 100 枚金幣的箱子。作為一群民主的海盜&#xff0c;他們同意以下分配戰利品的方法:最資深的海盜將…

購物商城網站 Java+Vue.js+SpringBoot,包括商家管理、商品分類管理、商品管理、在線客服管理、購物訂單模塊

購物商城網站 JavaVue.jsSpringBoot&#xff0c;包括商家管理、商品分類管理、商品管理、在線客服管理、購物訂單模塊 百度云盤鏈接&#xff1a;https://pan.baidu.com/s/10W0kpwswDSmtbqYFsQmm5w 密碼&#xff1a;68jy 摘 要 隨著科學技術的飛速發展&#xff0c;各行各業都在…

用mediamtx搭建簡易rtmp,rtsp視頻服務器

簡述&#xff1a; 平常測試的時候搭建rtmp服務器很麻煩&#xff0c;這個mediamtx服務器&#xff0c;只要下載就能運行&#xff0c;不用安裝、編譯、配置等&#xff0c;簡單易用、ffmpeg推流、vlc拉流 基礎環境&#xff1a; vmware17&#xff0c;centos10 64位&#xff0c;wi…

Java 高頻面試題場景(二):老年健康手環數據管理系統

系列文章 序號文章名稱1Java 高頻面試題場景(一):社區智能充電樁管理系統2Java 高頻面試題場景(二):老年健康手環數據管理系統文章目錄 系列文章一、項目信息項目介紹技術棧主要工作二、面試題及回答1. **面試官問**:在這個老年健康手環數據管理系統項目中,為什么要用R…

Python爬蟲爬取天貓商品數據,詳細教程【Python經典實戰項目】

Python爬取天貓商品數據詳細教程 一、前期準備 1. 環境配置 Python環境&#xff1a;確保已安裝Python 3.x版本&#xff0c;建議使用Anaconda或直接從Python官網下載安裝。第三方庫&#xff1a; requests&#xff1a;用于發送HTTP請求。BeautifulSoup&#xff1a;用于解析HTM…

Symbol as Points: Panoptic Symbol Spotting via Point-based Representation

文章目錄 AbstractIntroductionRelated WorkVector Graphics RecognitionPanoptic Symbol SpottingPoint Cloud Segmentation MethodFrom Symbol to PointsPrimitive positionPrimitive feature Panoptic Symbol Spotting via Point-based RepresentationBackboneSymbol Spotti…

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()獲取任意值的類型對象1.2、reflect.ValueOf()1.3、結構體反射 2、文件操作2.1、os.Open()打開文件2.2、方式一&#xff1a;使用Read()讀取文件2.3、方式二&#xff1a;bufio讀取文件2.4、方式三&#xff1a;os.ReadFile讀取2.5、寫…

[閉源saas選項]Pinecone:為向量數據庫而生的實時語義搜索引擎

目錄 Pinecone&#xff1a;為向量數據庫而生的實時語義搜索引擎 一、什么是 Pinecone&#xff1f; 二、Pinecone 是開源的嗎&#xff1f;支持私有化部署嗎&#xff1f; 三、為什么需要向量搜索&#xff1f; 四、Pinecone 的核心優勢 五、使用 Pinecone 的典型流程 六、在…

【Maniskill】使用Ppo的官方基線訓練時出現指標突然“塌陷”的現象

1. 問題描述 1.1 在使用官方代碼進行訓練的時候“success_once突然掉落到0” 簡要說明你在使用官方 examples/baselines/ppo/baselines.sh 腳本訓練 PickCube-v1 時&#xff0c;在 early stage&#xff08;如前 50 k 步&#xff09;指標正常、success_once 接近 1&#xff0c;…

本地部署大模型實戰:使用AIStarter一鍵安裝Ollama+OpenWeb教程(含最新版本更新指南)

大家好&#xff01;今天給大家帶來一個本地部署大模型的詳細教程 &#xff0c;主要介紹如何通過 AIStarter 4.0 一鍵部署 Ollama OpenWeb 的完整流程。如果你還在為在線大模型不穩定、隱私泄露等問題煩惱&#xff0c;那么本地部署 將是一個非常不錯的選擇&#xff01; 首先&am…

Redis大量key集中過期怎么辦

當 Redis 中存在大量 key 在同一時間點集中過期時&#xff0c;可能會導致以下問題&#xff1a; 請求延遲增加&#xff1a;Redis 在處理過期 key 時需要消耗 CPU 資源&#xff0c;如果過期 key 數量龐大&#xff0c;會導致 Redis 實例的 CPU 占用率升高&#xff0c;進而影響其他…

【Linux 學習計劃】-- 系統中進程是如何調度的(內核進程調度隊列)

目錄 回顧進程優先級與進程調度的引入 內核runqueue圖例 關于queue[140]前100個位置 | 實時進程與分時進程 遍歷需要調度的進程與bitmap的引入 active、expired指針 結語 回顧進程優先級與進程調度的引入 在我們之前的學習中&#xff0c;我們是有學習過進程優先級這個概…

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入門(1)——Chat Client API

Spring AI框架快速入門 一、前言二、前期準備2.1 運行環境2.2 maven配置2.3 api-key申請 三、Chat Client API3.1 導入pom依賴3.2 配置application.properties文件3.3 創建 ChatClient3.3.1 使用自動配置的 ChatClient.Builder3.3.2 使用多個聊天模型 3.4 ChatClient請求3.5 Ch…

微信小程序開發一個自定義組件的詳細教程

以下是一個微信小程序自定義組件的詳細教程&#xff0c;覆蓋開發文檔中的核心知識點。我們將以一個包含屬性、事件、插槽、生命周期等功能的按鈕組件為例進行說明&#xff1a; 一、創建組件 在 components 目錄下新建 custom-button 文件夾&#xff0c;包含以下文件&#xff…

模電——第四講場效應管

定義&#xff1a;具有正向受控作用的半導體器件 分類&#xff1a;MOS&#xff08;絕緣柵&#xff09;場效應管和結性場效應管 區別&#xff1a;場效應管相比于晶體管&#xff0c;輸入電阻很大&#xff0c;是單極型器件 MOS場效應管&#xff1a; 特性曲線 利用半導體表面的電…

[藍橋杯]堆的計數

堆的計數 題目描述 我們知道包含 NN 個元素的堆可以看成是一棵包含 NN 個節點的完全二叉樹。 每個節點有一個權值。對于小根堆來說&#xff0c;父節點的權值一定小于其子節點的權值。 假設 NN 個節點的權值分別是 1~NN&#xff0c;你能求出一共有多少種不同的小根堆嗎&…

論文閱讀:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻譯 自動駕駛技術作為推動交通和城市出行變革的催化劑&#xff0c;正從基于規則的系統向數據驅動策略轉變。傳統的模塊化系統受限于級聯模塊間的累積誤差和缺乏靈活性的預設規則。…

WebRTC中的幾個Rtp*Sender

一、問題&#xff1a; webrtc當中有幾個比較相似的類&#xff0c;看著都是發送RTP數據包的&#xff0c;分別是&#xff1a;RtpPacketToSend 和RtpSenderVideo還有RtpVideoSender以及RTPSender&#xff0c;這說明什么呢&#xff1f;首先&#xff0c;說明我會很多連詞&#xff0…

EFI(x64)簡易開發環境

文章目錄 1 必須文件2 運行環境3 構建應用 (Visual Studio)4 引用 EDK2 頭文件 1 必須文件 EDK2: 可以只拉取倉庫本身, 不拉取其子倉庫(完整構建才需要) qemu: qemu 以源碼發布, QEMU for Windows – Installers (64 bit) 這里有民間構建的安裝包 2 運行環境 創建一個 root …

八皇后問題深度解析

八皇后問題深度解析 一、八皇后問題的起源與背景1.1 問題起源1.2 歷史發展 二、問題描述與約束條件2.1 問題描述2.2 約束條件 三、算法原理&#xff1a;回溯算法3.1 回溯算法概述3.2 八皇后問題的回溯算法實現思路 四、八皇后問題的多語言實現4.1 Python實現4.2 C實現4.3 Java實…