iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >什么是近似算法
  • 938
分享到

什么是近似算法

2024-04-02 19:04:59 938人浏览 安东尼
摘要

这篇文章主要介绍“什么是近似算法”,在日常操作中,相信很多人在什么是近似算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是近似算法”的疑惑有所帮助!接下来,请跟着小编一

这篇文章主要介绍“什么是近似算法”,在日常操作中,相信很多人在什么是近似算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是近似算法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

什么是近似算法?

近似算法是一种处理优化问题 NP 完全性的方式,它无法确保最优解。近似算法的目标是在多项式时间内尽可能地接近最优值。

它虽然无法给出精确最优解,但可以将问题收敛到最终解的近似值。其目标满足以下三个关键特性:

能够在多项式时间内高效运行;

能够给出最优解;

对于每个问题实例均有效。

背景

数学表达式的评估常伴随常量、变量分析和方程的阶,可用于衡量近似的复杂度。此类评估将问题分解为 P 和 NP 难问题

P 问题和 NP 问题的策略

P 问题是指可以在多项式时间内求解的问题。

NP 表示不确定性多项式时间(nondeterministic polynomial time),NP 问题是指在多项式时间内近似验证答案的问题。但目前人们发现,很多此类问题需要指数时间才能求解。

什么是近似算法

P 和 NP 策略。

真正的争论在于 P=NP 还是 P≠NP。之前的一些研究证明这两种都是对的。如果一个问题是多项式次方,则存在多个最优算法。因此,在 NP 完全问题中,存在两种方法找到近优解,然后选择最适合的算法。

如果输入的大小比较小,则具备指数运行时间的算法可能会比较适合。

其次,通过用近似算法替代确定性算法,我们仍然能够在多项式时间内找到近优解。

近似算法的复杂度可以从输入大小和近似因子中推断出来。接下来,我们通过一些示例,深入探索这些算法如何应用到现实问题中。

分区问题(Partition Problem)

在计算机科学领域,该问题的定义是:给定多重正整数集 X,它可以被分割为两个元素之和相等的子集 X1 和 X2,即每个子集的数值之和与另一个子集相等。

什么是近似算法

例如,X={3,4,1,3,3,2,3,2,1} 可以被分割为 X1={3,3,2,3} 和 X2={4,2,3,1,1},二者的数值之和都是 11。

类似地,X={1,3,1,2,1,2} 可以被分成 X1={2,1,1,1} 和 X2={3,2},两个子集的数值之和都是 5。有趣的是,这不是唯一解。X1={1,3,1} 和 X2={2,1,2} 的数值之和也为 5,这表明存在多个可能的子集。

这就是 NP 完全问题,存在伪多项式时间动态规划解,可获得该问题的近优解。

方法和决定步骤

现在,我们开始分析这个问题,把它分解成数个单独的标准问题。这里,我们想要找出多重集的元素之和相等的子集,那么该问题就可以分解成以下两个问题:

子集和问题:子集 X 的元素之和等于数字 W。

多路数字分割:给定整数参数 W,确定如何将 X 分割成 W 个等额子集。

近似算法

如上所述,将分区问题分解为多路分割与子集和问题后,我们就可以考虑为这些问题而开发的算法,包括:

贪婪数字分割(Greedy number Partitioning)

该算法循环遍历所有数字,将每个数字分配给总和最小的子集。如果数字未以排序方式排列,则其运行时复杂度为 O(n),近似率约为 3/2。其 python 伪代码如下:

def find_partition(numbers): """Separate the available numbers into two eqal sum series.

Args: numbers: collection of numbers, for example list of integers.

Returns: Two lists of numbers. """ X = [] Y = [] sum_X = 0 sum_Y = 0 for n in sorted(numbers, reverse=True): if sum_X < sum_Y: X.append(n) sum_X = sum_X + n else: Y.append(n) sum_Y = sum_Y + n return (X, Y)

将数字排序,则运行时复杂度增加到 O(n logn),近似率增加到 7/6。如果数字在 [0,1] 范围内均匀分布,则近似率约为 1 + O(log logn/n)。

什么是近似算法

分区问题图示。

上图用二叉树的形式展示所有分区。树的根部表示集合中的最大数,每一级对应输入数字,每个独立分支对应不同的子集。遍历这些集合需要深度优先遍历(depth-first traversal),所需的空间复杂度为 O(n),时间复杂度为 O(2^n)。

适用性:

该算法可以根据情况进行修改,以便改善运行时复杂度。每一级的首要目标是构建一个分支,将当前数字分配给总和最小的子集。首先通过贪婪数字分割找出总和,然后切换到优化,得到全多项式时间近似解。

Karmarkar-Karp 算法

Karmarkar-Karp 算法指以降序方式排列数字的最大差分方法,该方法将差值替换掉原来的数字不断放进集合中。其 Java 伪代码实现如下:

int karmarkarKarpPartition(int[] baseArr) { // create max heap PriorityQueue heap = new PriorityQueue(baseArr.length, REVERSE_INT_CMP);

for (int value : baseArr) { heap.add(value); }

while (heap.size() > 1) { int val1 = heap.poll(); int val2 = heap.poll(); heap.add(val1 - val2); }

return heap.poll();}

该算法包含输入集 S 和参数 k。将 S 分割成 k 个子集,使这些子集中的数字总和相等,从而构建期望输出。该算法包含如下关键步骤:

以降序方式排列数字;

用差值替换掉原来的数字,直到只有一个数字;

采用回溯算法,完成分区。

适用性:

该算法通过构建二叉树来假设分区。每一级表示一对数字,左侧的分支表示用差值替换数字,右侧的分支表示将差值放置在同一个子集中。该算法先通过最大差分求得解,然后继续寻找更好的近似解。它所需的空间复杂度为 O(n),但最糟糕的情况下所需的时间复杂度可能会达到 O(2^n)。

装箱问题

装箱问题有多种现实应用。例如,如何从根本上改善印度的垃圾管理系统。这个问题就可以通过装箱问题来解决,帮助当局决定 x 量的垃圾需要多少个垃圾箱。

什么是近似算法

集装箱船:装箱问题的现实应用。

在计算机科学领域中,该问题可用于多种内存管理技术。在该算法中,我们可以通过去除冗余和最小化空间浪费来包装不同形状和大小的对象。

例如:给定一个包含 n 个项的集合,每个项的大小分别为 s1,s2,..,sn (0

经典方法:

1. 邻近适应算法 (Next Fit):查看当前项是否适合当前箱子。如果适合,则将物品放置在箱子里,否则开启一个新的箱子。

我们来看一个示例:项是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子大小均为 1。

什么是近似算法

基于邻近适应算法的装箱解决方案(M = 箱子总数 = 6)。

2. 最先匹配法 (First Fit):按顺序浏览箱子,在第一个箱中放置新的项,直到放不下再启用新的箱子。

我们来看一个示例:项是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子的大小均为 1。

什么是近似算法

基于最先匹配法的装箱解决方案(M = 箱子总数 = 5)。

3. 最优匹配法 (Best Fit):按顺序浏览箱子,将每一个新的项放在最适合的箱子里。如果不适合,则创建一个新的箱子。

我们来看一个示例:项是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子的大小均为 1。

什么是近似算法

基于最优匹配法的装箱解决方案(M = 箱子总数 = 5)。

该方法的输出与最先匹配法相同,但该方法的优点是实现速度比 FFD 快,即时间复杂度为 O(nlogn)。

自然方法:

如果我们提前知道所有项的大小,那么自然的解决方案就是首先按照从大到小排序,然后应用以下启发式方法:

最先匹配递减法

最优匹配递减法

假设有相同的示例 0.7, 0.6, 0.5, 0.5, 0.5, 0.4, 0.2, 0.2, 0.1,则排序为 0.7, 0.6, 0.5, 0.5, 0.5, 0.4, 0.2, 0.2, 0.1。

什么是近似算法

优化方法(M = 箱子总数 = 4)。

到此,关于“什么是近似算法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 什么是近似算法

本文链接: https://www.lsjlt.com/news/84143.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是近似算法
    这篇文章主要介绍“什么是近似算法”,在日常操作中,相信很多人在什么是近似算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是近似算法”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2024-04-02
  • c语言实现计算圆周率的近似值
    目录c语言计算圆周率的近似值用C语言解“计算圆周率”题思路代码总结c语言计算圆周率的近似值 用公式π/4=1-1/3+1/5-1/7+1/9-&hell...
    99+
    2022-12-08
    c语言近似值 c语言计算圆周率 计算圆周率近似值
  • C++实现二分法求方程近似解
    二分法是一种求解方程近似根的方法。对于一个函数 f(x)f(x),使用二分法求 f(x)f(x) 近似解的时候,我们先设定一个迭代区间(在这个题目上,我...
    99+
    2024-04-02
  • java算法之余弦相似度计算字符串相似率
    目录概述一、理论知识1、说重点2、案例理论知识二、实际开发案例1、pom.xml2、main方法3、Tokenizer(分词工具类)4、Word(封装分词结果)5、CosineSim...
    99+
    2024-04-02
  • python基础中K近邻算法是怎样的
    python基础中K近邻算法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、k-近邻算法原理及API1.k-近邻算法原理如果一个样本在特征空间中的k个最相似(即特征空...
    99+
    2023-06-25
  • 编程中的算法:PHP和NumPy有什么相似之处?
    在编程中,算法是一项非常重要的技能。无论是开发网站、编写应用程序还是进行数据分析,算法都扮演着至关重要的角色。PHP和NumPy作为两种流行的编程语言,都具有丰富的算法库和函数。本文将探讨PHP和NumPy在算法方面的相似之处,并通过演示...
    99+
    2023-09-30
    apache 编程算法 numy
  • RSA算法是什么
    今天就跟大家聊聊有关RSA算法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。2. 加密算法的一点历史我们知道常见的加密算法有:对称加密和非对称...
    99+
    2024-04-02
  • java算法之余弦相似度计算字符串相似率的示例分析
    小编给大家分享一下java算法之余弦相似度计算字符串相似率的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java有哪些集合类Java中的集合主要分为四类...
    99+
    2023-06-15
  • MySql为什么总是说on primary附近语法错误
    当MySQL报告在“ON PRIMARY”附近发生语法错误时,这通常意味着您在创建表或添加约束时使用了错误的语法。在MySQL中,使...
    99+
    2023-08-19
    MySql
  • 什么是分支算法
    这篇文章主要介绍“什么是分支算法”,在日常操作中,相信很多人在什么是分支算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是分支算法”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2024-04-02
  • 贪心算法是什么
    本篇文章给大家分享的是有关贪心算法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 概念贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化...
    99+
    2023-06-19
  • 什么是递归算法
    这篇文章主要介绍“什么是递归算法”,在日常操作中,相信很多人在什么是递归算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是递归算法”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2024-04-02
  • Python机器学习之KNN近邻算法
    目录一、KNN概述二、使用Python导入数据三、numpy.array()四、实施KNN分类算法五、计算已知类别数据集中的点与当前点之间的距离六、完整代码七、数据处理、分析、测试八...
    99+
    2024-04-02
  • 【python】机器学习-K-近邻(KNN)算法
             目录 一 . K-近邻算法(KNN)概述  二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法(KNN)概述          K-近邻算法(KNN)是一种基本的分类算法,它通过计算数据点之...
    99+
    2023-10-22
    python matlab 机器学习 算法
  • 字符串相似度算法-莱文斯坦距离算法
    莱文斯坦(Levenshtein)距离 莱文斯坦距离可以解决字符串相似度的问题。在莱文斯坦距离中,对每一个字符都有三种操作:删除、添加、替换例如有s1和s2两个字符串,a和b是与之对应的保存s1和s2全部字符的数组,i/j是数组下标。莱文...
    99+
    2023-01-31
    算法 字符串 文斯
  • ASP和NumPy的相似之处是什么?
    ASP和NumPy的相似之处是什么? ASP(Active Server Pages)是一种服务器端脚本语言,用于创建动态Web页面。而NumPy则是Python的一个科学计算库,提供了高效的数组操作和数学函数,广泛应用于科学计算、数据分析...
    99+
    2023-09-22
    响应 numpy unix
  • python OpenCV计算图片相似度的5种算法
    目录5种算法参考文章:原始两张图片: 代码运行结果如下。 5种算法 值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值...
    99+
    2024-04-02
  • golang和什么相似
    golang和c语言相似。Go语言被描述为“C 类似语言”,或者是“21 世纪的C语言”,其语法与C相近;Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效...
    99+
    2023-05-14
    go语言 Golang
  • Python机器学习k-近邻算法怎么实现
    这篇文章主要介绍“Python机器学习k-近邻算法怎么实现”,在日常操作中,相信很多人在Python机器学习k-近邻算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python机器学习k-近邻算法怎...
    99+
    2023-06-21
  • Python怎么用scikit-learn实现近邻算法分类
    今天小编给大家分享一下Python怎么用scikit-learn实现近邻算法分类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作