![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 51
Kingdom_bo
西部某985毕业生,现就职于阿里巴巴集团。
展开
-
记忆化搜索到底有多快?!黑死人!
今天闲来没事写了个程序验证了下记忆化搜索到底有多快,结果真让我大开眼界!我使用的是计算斐波那契数的程序,Fib1表示未使用记忆化的搜索过程,Fib2表示使用记忆化的搜索过程。我随机输入了一个数据,结果是这样的:看这个结果,简直黑死人。所以,记忆化搜索yyds!#include<iostream>using namespace std;int count1=0;int count2=0;int a[1000]={0};int Fib1(int n);int Fib2(int n)原创 2021-06-13 22:22:02 · 196 阅读 · 0 评论 -
牛顿下降回溯直线及基于停止准则的搜索算法结果分析和比较(XJTU优化课第四章算法实现)
今天这个程序的主要是比较在求一个约束函数的最优值时,采取停止准则的搜索方法和回溯直线搜索方法的优劣。话不多说,先上结论:就我所测试的函数,我改变了多个测试函数和不同的初始值,并测试了不同的回溯因子。结论是我要吹爆停止准则的搜索方法,该方法总是能够获得较好的优化值,但是回溯法甚至不能满足初始迭代条件,即使能够满足,得到的优化结论误差也大得离谱。话不多说,我直接上相关算法,算法如下:基于以上算法,我构造了一个二元函数,并编写了以下代码进行测试。读者可以直接上手我的代码进行测试。#等式约束的牛顿方法+回溯原创 2021-06-13 01:41:16 · 1073 阅读 · 0 评论 -
优化方法之正定二次函数的共轭梯度法及其实现(基于Python)
共轭梯度法也是共轭方向法中的一种,但是它减少了梯度方向的搜索量,它直接采取经过一维搜索最小点处的梯度方向作为我们的搜索方向,因而在计算速度上有了一定的提升。如果你对这些优化算法感到困惑,现在你需要明白共轭方向法是基于最速下降法的改进,因为最速下降法在接近最优值时的锯齿现象降低了迭代搜索的速度,共轭法则提升了最速下降法的速度。本节所讲的共轭梯度法则是共轭方向法的进一步改进,一个直观原因是它减少了方向的搜索。同时此算法需要同时计算当前点和下一点并据此得到一些新的中间变元。在你明白这个逻辑 后,请参考以下算法原理原创 2021-06-12 15:44:24 · 2497 阅读 · 3 评论 -
优化方法之共轭梯度法分析与实现(基于Python)
共轭梯度法也是解决无约束优化问题的常用迭代算法,它结合了最速下降法矩阵共轭梯度的性质,可以加快算法的迭代过程。且如果初始点选取后的最终优化中不满足精度条件,还可保存上一步得到的迭代点进行再次迭代直到获得较好的优化值。以上过程一般都可以获得较好的迭代点和优化值。该算法简介如下:根据以上算法过程,我们可以选取目标函数进行测试,以下是测试代码:(注:读者可以自由地在初始数据修改初始点、精度等参数,以观察和比较不同初始点的迭代过程,迭代最优值的差异等,如果读者希望修改目标函数,则需要在相应的函数定义处进行原创 2021-06-12 01:47:19 · 3260 阅读 · 2 评论 -
简单谈谈设计算法题的方法
“ 本篇文章我将分享一些算法设计的思想,仅仅是个人思考所得,欢迎各位读者与我交流!” Kingdombo 这个公众号创立的初衷在于分享一些与编程或者数学相关的问题,同时致力于探讨解决这些问题的本质,以及总结归纳看待问题的原创 2021-04-03 17:19:55 · 1733 阅读 · 0 评论 -
递归求解带权重的中位数!xjtu作业题!
题目:设有n个互不相同的元素x1,x2,…xk,每个元素xi带有一个权值wi,且∑ni=1wi=1。若元素xk满足∑xi<xkwi≤12且∑xi>xkwi≤12,则称元素xk为x1,x2,…,xn的带权中位数。请编写一个算法,能够在最坏情况下用O(n)时间找出n个元素的带权中位数。例如:10719 449 446 981 431 993 919 389 549 4530.01757775 0.02028202 0.16863048 0.07320842 0.16283562 0.161原创 2021-03-31 19:23:27 · 1330 阅读 · 5 评论 -
切割木块背后的人生哲学
今天给大家带来一道切割木块的问题,并和大家分享一些我自己在想算法和实现算法方面的一些思考。首先看看题目:已知有N段已知长度的树木(长度均为整数米),现将对这些树木进行切割,以使K段木头具有相同长度(均为整数米)。求符合题意的等长木头的最大长度。比如,输入N=3,K=7,三块木头的长度分别为10,24,15。那么,最大的长度为6米,因为10/6=1,24/6=4,15/6=2,所以1+2+4=7=K。不知道大家感觉怎么样,嘿嘿,其实对于我这个小白来说,我感觉第一眼看到还是有点懵逼的(大佬忽略),尤其是我原创 2021-03-24 02:03:40 · 251 阅读 · 0 评论 -
并查集基础操作详解
最近在学习并查集,讲真,这不就是离散数学中的等价类吗?哈哈。它主要有查询和归并操作。提供代码如下:#include<iostream>int FA[1000]; //利用该数组来存储每个元素的父节点void init(int n);//初始化并查集int Find(int x); //查询代表元素,算法,代表元素的父节点是他本身,可以根据此判断他们的两个节点是否相void Merge(int x, int y);//合并两个元素,只需查询其父子节点并设置好新的父子节点即可。int原创 2021-03-17 16:57:44 · 112 阅读 · 0 评论 -
一文讲透快速排序和递归!!!
快速排序该算法是一种对于数列进行排序的高级排序算法,在数据量较大的情况下,它的运行时间复杂度为O(nlogn),空间复杂度为O(1)。以下将介绍快速排序算法的基本步骤,并分析难点和注意事项。1. 算法步骤1.选定基准值,基准值的选取十分重要,这在很大程度上决定了该程序的运行效率。而当数据的随机性足够的时候,基准值的选取平均情形一致。文中代码选取基准值代号为base。2.区间划分。根据基准值对数列进行进行划分,使数列种所有不大于base的数都在base的左边,而所有比base大的数都在base的右边。原创 2021-03-06 21:28:30 · 501 阅读 · 0 评论 -
插入排序详解
插入排序算法步骤:1.从第一个元素开始,该元素默认已经排好序;2.取出下一个元素,在已经排好序的元素序列中从后向前扫描;3.如果已排序的元素大于取出的元素,则将已排序元素放入下一位置;4.重复步骤3,直到排序元素小于或者等于取出元素,将该元素插入到最后一个比较元素之后;5.重复步骤2到5重要的点:1.时间复杂度O(n^2),空间复杂度O(n);2.由于取出的元素仅当已排序元素大于取出元素时,才会发生位置的改变,所以该算法是稳定的;注意事项:1.由于是使用数组进行演示,因此请务必注意数组下原创 2021-03-04 22:37:53 · 139 阅读 · 1 评论 -
不相交集
在我们学习等价关系的时候,如何使用程序来对集合元素进行有效划分呢?请看以下程序。这个程序主要根据提示输入集合的关系矩阵,然后程序内部将自动读取相关元素并为其分配初始集合,然后,该程序对不同集合中有关系的集合进行重新分配,并入新的集合,直到这种归并结束。最后再该程序输出的划分结果。代码和注释如下:#include<iostream>#include<set>#include<vector>#include<assert.h>using namesp原创 2021-03-04 13:08:41 · 231 阅读 · 1 评论