贪心算法时间复杂度 贪心算法有哪些算法

牵着乌龟去散步 学知识 5 0

老铁们,大家好,相信还有很多朋友对于贪心算法时间复杂度和贪心算法有哪些算法的相关问题不太懂,没关系,今天就由我来为大家分享分享贪心算法时间复杂度以及贪心算法有哪些算法的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

本文目录

  1. 贪心算法马的遍历 时间复杂度
  2. 背包问题的贪心算法时间复杂度
  3. 背包问题贪心算法时间复杂度
  4. 克鲁斯卡尔算法是贪心算法吗

一、贪心算法马的遍历 时间复杂度

马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。

首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下:

如果c>64输出一个解,返回上一步骤c--

计算(x,y)的八个方位的子结点,选出那此可行的子结点

循环遍历所有可行子结点,步骤c++重复2

显然(2)是一个递归调用的过程,大致如下:

void dfs(int x,int y,int count)

output_solution();//输入一个解

tx=hn[i].x;//hn[]保存八个方位子结点

dfs(tx,ty,count+1);//递归调用

这样做是完全可行的,它输入的是全部解,但是马遍历当8×8时解是非常之多的,用天文数字形容也不为过,这样一来求解的过程就非常慢,并且出一个解也非常慢。

其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法。在每个结点对其子结点进行选取时,优先选择‘出口’最小的进行搜索,‘出口’的意思是在这些子结点中它们的可行子结点的个数,也就是‘孙子’结点越少的越优先跳,为什么要这样选取,这是一种局部调整更优的做法,如果优先选择出口多的子结点,那出口少的子结点就会越来越多,很可能出现‘死’结点(顾名思义就是没有出口又没有跳过的结点),这样对下面的搜索纯粹是徒劳,这样会浪费很多无用的时间,反过来如果每次都优先选择出口少的结点跳,那出口少的结点就会越来越少,这样跳成功的机会就更大一些。这种算法称为为贪心算法,也叫贪婪算法或启发示算法,它对整个求解过程的局部做更优调整,它只适用于求较优解或者部分解,而不能求更优解。这样的调整 *** 叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种 *** 完全可以用手工求出解来,其效率可想而知。

在前面的算法基础之上,增添一些程序加以实现:

if(x<0||y<0||x>=N||y>=N||s[x][y]>0)

return-1;//-1表示该结点非法或者已经跳过了

if(tx<0||ty<0||tx>=N||ty>=N)

void sortnode(h_node*hn,int n)//采用简单排序法,因为子结点数最多只有8

if(hn[j].waysout<hn[t].waysout)

void dfs(int x,int y,int count)

for(i=0;i<8;++i)//求子结点和出口

hn[i].waysout=ways_out(tx,ty);

for(i=0;hn[i].waysout<0;++i);//不考虑无用结点

贪心算法时间复杂度 贪心算法有哪些算法-第1张图片-

printf("Horse jump while N=%d\nInput the position to start:",N);

scanf("%d%d",&x,&y);//输入初始位置

while(x<0||y<0||x>=N||y>=N)

printf("Error! x,y should be in 0~%d",N-1);

二、背包问题的贪心算法时间复杂度

背包问题的贪心算法时间复杂度论述如下:

1、背包问题是一个经典的组合优化问题,目标是选择一组物品放入限定容量的背包中,使得物品的总价值更大化。贪心算法是一种常用的解决背包问题的 *** 之一,它通过在每一步选择当前情况下的更优解来逐步构建整体的解。

2、贪心算法的时间复杂度取决于算法的具体实现方式和问题规模。下面我将讨论两种常见的背包问题及其贪心算法的时间复杂度。

3、0-1背包问题:0-1背包问题是最基本的背包问题,假设背包容量为C,有n个物品,每个物品有重量w和价值v。问题要求从这n个物品中选择一部分物品放入背包中,使得放入背包的物品总价值更大,同时总重量不超过背包的容量。

4、贪心算法的基本思想是按照物品的单位价值(即价值除以重量)进行排序,然后依次将单位价值更高的物品放入背包中,直到背包放满或者没有物品可选。

5、时间复杂度分析:在一般情况下,贪心算法的时间复杂度为O(nlogn),其中n为物品的数量。这是因为算法需要对n个物品进行排序,排序的时间复杂度为O(nlogn)。之后,从头到尾依次选择物品放入背包需要O(n)的时间。因此,总的时间复杂度为O(nlogn)。

6、分数背包问题:分数背包问题是背包问题的变种,与0-1背包问题不同的是,分数背包问题中物品可以被分割成任意大小,而不是只能选择整个物品或者不选择。

7、贪心算法的基本思想是按照物品的单位价值进行排序,然后依次选择单位价值更高的物品,直到背包放满或者没有物品可选。如果某个物品无法完整装入背包中,那么可以将它分割成若干部分,选择其中一部分放入背包中,以便达到更优解。

8、时间复杂度分析:在分数背包问题中,贪心算法的时间复杂度也为O(nlogn),其中n为物品的数量。排序的时间复杂度为O(nlogn),将物品划分成若干部分需要O(n)的时间。因此,总的时间复杂度为O(nlogn)。

三、背包问题贪心算法时间复杂度

1、背包问题贪心算法时间复杂度如下:

2、背包问题是一类典型的动态规划问题,贪心算法可以解决其中的某些特殊情况。下面我将简要讨论贪心算法在背包问题上的应用和其时间复杂度。

3、在背包问题中,我们有一组物品,每个物品有特定的重量和价值。我们的目标是在不超过背包的更大重量限制的情况下,选择一组物品,使得它们的总价值更大。

4、贪心算法的基本思想是总是选择当前看来价值更大的物品。在背包问题中,我们首先按照物品的单位重量价值(即价值/重量)从大到小排序,然后从价值更高的物品开始,尽可能多地放入背包,直到背包满为止。

5、贪心算法的时间复杂度主要取决于排序的复杂性。为了对物品按照单位重量价值进行排序,我们可以使用任何内部排序算法(例如快速排序、归并排序等),其时间复杂度通常是O(n log n),其中n是物品的数量。在对物品排序后,我们需要遍历所有物品并选择放入背包的物品,这需要O(n)的时间复杂度。因此,贪心算法的总时间复杂度是O(n log n)。

6、需要注意的是,贪心算法不一定能得到更优解。例如,如果物品的重量不是整数,贪心算法可能会得到一个次优解。在这种情况下,我们需要使用动态规划或其他更复杂的 *** 来得到更优解。

四、克鲁斯卡尔算法是贪心算法吗

1、克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个。这里面充分体现了贪心算法的精髓。

2、克鲁斯卡尔算法是求连通网的最小生成树的另一种 *** 。与普里姆算法不同,它的时间复杂度为O(eloge)(e为网中的边数),所以,适合于求边稀疏的网的最小生成树。

3、克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。

4、在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止。

5、克鲁斯卡尔算法思想设计克鲁斯卡尔算法函数主要包括两个部分:首先是带权图G中e条边的权值的排序;其次是判断新选取的边的两个顶点是否属于同一个连通分量。对带权图G中e条边的权值的排序 *** 可以有很多种,各自的时间复杂度均不相同。

6、对e条边的权值排序算法时间复杂度较好的算法有快速排序法、堆排序法等,这些排序算法的时间复杂度均可以达到O(elge)。判断新选取的边的两个顶点是否属于同一个连通分量的问题是一个在最多有n个顶点的生成树中遍历寻找新选取的边的两个顶点是否存在的问题,此算法的时间复杂度最坏情况下为O(n)。

如果你还想了解更多这方面的信息,记得收藏关注本站。

标签: 算法 贪心 复杂度 哪些 时间

抱歉,评论功能暂时关闭!