算法怎么学

作者&投稿:唱先 (若有异议请与网页底部的电邮联系)
学时怎么计算~


1,简便运算最常用的就是加法结合律,加法交换律,乘法结合律,乘法交换律,乘法分配律。这几种运算定律要熟练掌握。
2,利用减法的性质的简便,使用减法性质的简便运算时理解一个数连续减去两个数时,可以先减去一个数再减去另一个数,也可以减去后两个的和。

3,利用除法商不变的性质进行简便运算,被除数和除数同时乘以或除以相同的数(零除外)商不变。
注意几点:
1,概念理解错误
道理不明白,对定律不理解,对知识理解不灵活,对问题理解片面,学习习惯差,粗心大意。
2,死搬硬套

在四则运算中,简便运算普遍存在,但并不是所有的四则运算都能用简便算法。

3,灵活运用
在熟练掌握运算定律和运算性质的基本方法后,可以计算一些较难的简算题。

贪心算法的定义:

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

解题的一般步骤是:

1.建立数学模型来描述问题;

2.把求解的问题分成若干个子问题;

3.对每一子问题求解,得到子问题的局部最优解;

4.把子问题的局部最优解合成原来问题的一个解。

如果大家比较了解动态规划,就会发现它们之间的相似之处。最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。

话不多说,我们来看几个具体的例子慢慢理解它:

1.活动选择问题

这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。

考虑使用贪心算法的解法。为了方便,我们用不同颜色的线条代表每个活动,线条的长度就是活动所占据的时间段,蓝色的线条表示我们已经选择的活动;红色的线条表示我们没有选择的活动。 如果我们每次都选择开始时间最早的活动,不能得到最优解:

如果我们每次都选择持续时间最短的活动,不能得到最优解:

可以用数学归纳法证明,我们的贪心策略应该是每次选取结束时间最早的活动。直观上也很好理解,按这种方法选择相容活动为未安排活动留下尽可能多的时间。这也是把各项活动按照结束时间单调递增排序的原因。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;    
int N;
struct Act
{
int start;
int end;
}act[100010];

bool cmp(Act a,Act b)  
{
return a.end<b.end;  
}

int greedy_activity_selector()  
{
int num=1,i=1;
for(int j=2;j<=N;j++)
{
if(act[j].start>=act[i].end)
{
i=j;  

2.钱币找零问题

这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。


}

3.再论背包问题

从零开始学动态规划

中我们已经谈过三种最基本的背包问题:零一背包,部分背包,完全背包。很容易证明,背包问题不能使用贪心算法。然而我们考虑这样一种背包问题:在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。这时便可以使用贪心算法求解了。计算每种物品的单位重量价值作为贪心选择的依据指标,选择单位重量价值最高的物品,将尽可能多的该物品装入背包,依此策略一直地进行下去,直到背包装满为止。在零一背包问题中贪心选择之所以不能得到最优解原因是贪心选择无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。在程序中已经事先将单位重量价值按照从大到小的顺序排好。



}

4.多机调度问题 n个作业组成的作业集,可由m台相同机器加工处理。要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。作业不能拆分成更小的子作业;每个作业均可在任何一台机器上加工处理。这个问题是NP完全问题,还没有有效的解法(求最优解),但是可以用贪心选择策略设计出较好的近似算法(求次优解)。当n<=m时,只要将作业时间区间分配给作业即可;当n>m时,首先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说从剩下的作业中,选择需要处理时间最长的,然后依次选择处理时间次长的,直到所有的作业全部处理完毕,或者机器不能再处理其他作业为止。如果我们每次是将需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处理完了只剩所需时间最长的作业在处理的情况,这样势必效率较低。在下面的代码中没有讨论n和m的大小关系,把这两种情况合二为一了。

5.小船过河问题 POJ1700是一道经典的贪心算法例题。题目大意是只有一艘船,能乘2人,船的运行速度为2人中较慢一人的速度,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久。先将所有人过河所需的时间按照升序排序,我们考虑把单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式: 1.最快的和次快的过河,然后最快的将船划回来;次慢的和最慢的过河,然后次快的将船划回来,所需时间为:t[0]+2*t[1]+t[n-1]; 2.最快的和最慢的过河,然后最快的将船划回来,最快的和次慢的过河,然后最快的将船划回来,所需时间为:2*t[0]+t[n-2]+t[n-1]。 算一下就知道,除此之外的其它情况用的时间一定更多。每次都运送耗时最长的两人而不影响其它人,问题具有贪心子结构的性质。 AC代码:


}

6.区间覆盖问题 POJ1328是一道经典的贪心算法例题。题目大意是假设海岸线是一条无限延伸的直线。陆地在海岸线的一侧,而海洋在另一侧。每一个小的岛屿是海洋上的一个点。雷达坐落于海岸线上,只能覆盖d距离,所以如果小岛能够被覆盖到的话,它们之间的距离最多为d。题目要求计算出能够覆盖给出的所有岛屿的最少雷达数目。对于每个小岛,我们可以计算出一个雷达所在位置的区间。

问题转化为如何用尽可能少的点覆盖这些区间。先将所有区间按照左端点大小排序,初始时需要一个点。如果两个区间相交而不重合,我们什么都不需要做;如果一个区间完全包含于另外一个区间,我们需要更新区间的右端点;如果两个区间不相交,我们需要增加点并更新右端点。 AC代码:


//按区间左端点排序
double s=point[0].y;
//区间右端点
for(int i=1;i&lt;n;i++)
{
if(point[i].x&gt;s)
//如果两个区间没有重合,增加雷达数目并更新右端点
{
counting++;
s=point[i].y;
}
else if(point[i].y&lt;s)
//如果第二个区间被完全包含于第一个区间,更新右端点
{
s=point[i].y;
}
}
}
cout&lt;&lt;"Case "&lt;&lt;num&lt;&lt;':'&lt;&lt;' '&lt;&lt;counting&lt;&lt;endl;
num++;
}
}

7.销售比赛 在学校OJ上做的一道比较好的题,这里码一下。假设有偶数天,要求每天必须买一件物品或者卖一件物品,只能选择一种操作并且不能不选,开始手上没有这种物品。现在给你每天的物品价格表,要求计算最大收益。首先要明白,第一天必须买,最后一天必须卖,并且最后手上没有物品。那么除了第一天和最后一天之外我们每次取两天,小的买大的卖,并且把卖的价格放进一个最小堆。如果买的价格比堆顶还大,就交换。这样我们保证了卖的价格总是大于买的价格,一定能取得最大收益。

#include&lt;queue&gt;
#include&lt;vector&gt;
#include&lt;cstdio&gt;
#include&lt;cstdlib&gt;
#include&lt;cstring&gt;
#include&lt;iostream&gt;
#include&lt;algorithm&gt;
using namespace std;
long long int price[100010],t,n,res;

int main()
{
ios::sync_with_stdio(false);
cin&gt;&gt;t;
while(t--)
{
cin&gt;&gt;n;
priority_queue&lt;long long int, vector&lt;long long int&gt;, greater&lt;long long int&gt; &gt; q;
res=0;
for(int i=1;i&lt;=n;i++)
{
cin&gt;&gt;price[i];
}
res-=price[1];
res+=price[n];
for(int i=2;i&lt;=n-1;i=i+2)
{
long long int buy=min(price[i],price[i+1]);
long long int sell=max(price[i],price[i+1]);
if(!q.empty())
{
if(buy&gt;q.top())
{
res=res-2*q.top()+buy+sell;
q.pop();
q.push(buy);
q.push(sell);
}
else
{
res=res-buy+sell;
q.push(sell);
}
}
else
{
res=res-buy+sell;
q.push(sell);
}
}
cout&lt;&lt;res&lt;&lt;endl;
}
}

下面我们结合数据结构中的知识讲解几个例子。 8.Huffman编码 这同样是《算法导论》上的例子。Huffman编码是广泛用于数据文件压缩的十分有效的编码方法。我们可以有多种方式表示文件中的信息,如果用01串表示字符,采用定长编码表示,则需要3位表示一个字符,整个文件编码需要300000位;采用变长编码表示,给频率高的字符较短的编码,频率低的字符较长的编码,达到整体编码减少的目的,则整个文件编码需要(45×1+13×3+12×3+16×3+9×4+5×4)×1000=224000位,由此可见,变长码比定长码方案好,总码长减小约25%。

对每一个字符规定一个01串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀,这种编码称为前缀码。可能无前缀码是一个更好的名字,但是前缀码是一致认可的标准术语。编码的前缀性质可以使译码非常简单:例如001011101可以唯一的分解为0,0,101,1101,因而其译码为aabe。译码过程需要方便的取出编码的前缀,为此可以用二叉树作为前缀码的数据结构:树叶表示给定字符;从树根到树叶的路径当作该字符的前缀码;代码中每一位的0或1分别作为指示某节点到左儿子或右儿子的路标。

从上图可以看出,最优前缀编码码的二叉树总是一棵完全二叉树,而定长编码的二叉树不是一棵完全二叉树。 给定编码字符集C及频率分布f,C的一个前缀码编码方案对应于一棵二叉树T。字符c在树T中的深度记为dT(c),dT(c)也是字符c的前缀码长。则平均码长定义为:

使平均码长达到最小的前缀码编码方案称为C的最优前缀码。      Huffman编码的构造方法:先合并最小频率的2个字符对应的子树,计算合并后的子树的频率;重新排序各个子树;对上述排序后的子树序列进行合并;重复上述过程,将全部结点合并成1棵完整的二叉树;对二叉树中的边赋予0、1,得到各字符的变长编码。

POJ3253一道就是利用这一思想的典型例题。题目大意是有把一块无限长的木板锯成几块给定长度的小木板,每次锯都需要一定费用,费用就是当前锯的木板的长度。给定各个要求的小木板的长度以及小木板的个数,求最小的费用。以要求3块长度分别为5,8,5的木板为例:先从无限长的木板上锯下长度为21的木板,花费21;再从长度为21的木板上锯下长度为5的木板,花费5;再从长度为16的木板上锯下长度为8的木板,花费8;总花费=21+5+8=34。利用Huffman思想,要使总费用最小,那么每次只选取最小长度的两块木板相加,再把这些和累加到总费用中即可。为了提高效率,使用优先队列优化,并且还要注意使用long long int保存结果。 AC代码:

#include&lt;queue&gt;
#include&lt;cstdio&gt;
#include&lt;iostream&gt;
using namespace std;

int main()
{
long long int sum;
int i,n,t,a,b;
while(~scanf("%d",&amp;n))
{
priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt;q;
for(i=0;i&lt;n;i++)
{
scanf("%d",&amp;t);
q.push(t);
}
sum=0;
if(q.size()==1)
{
a=q.top();
sum+=a;
q.pop();
}
while(q.size()&gt;1)
{
a=q.top();
q.pop();
b=q.top();
q.pop();
t=a+b;
sum+=t;
q.push(t);
}
printf("%lld
",sum);
}
}

9.Dijkstra算法 Dijkstra算法是由E.W.Dijkstra于1959年提出,是目前公认的最好的求解最短路径的方法,使用的条件是图中不能存在负边。算法解决的是单个源点到其他顶点的最短路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点,简单的说就是bfs+贪心算法的思想。

#include&lt;iostream&gt;
#include&lt;algorithm&gt;
#define INF 1000
#define MAX_V 100
using namespace std;  

int main()
{
int V,E;
int i,j,m,n;
int cost[MAX_V][MAX_V];
int d[MAX_V];
bool used[MAX_V];
cin&gt;&gt;V&gt;&gt;E;
fill(d,d+V+1,INF);
fill(used,used+V,false);
for(i=0;i&lt;V;i++)
{
for(j=0;j&lt;V;j++)
{
if(i==j) cost[i][j]=0;
else cost[i][j]=INF;
}
}
for(m=0;m&lt;E;m++)
{
cin&gt;&gt;i&gt;&gt;j&gt;&gt;cost[i][j];
cost[j][i]=cost[i][j];
}
cin&gt;&gt;n;
d[n]=0;
//源点
while(true)
{
int v=V;
for(m=0;m&lt;V;m++)
{
if((!used[m])&amp;&amp;(d[m]&lt;d[v])) v=m;
}
if(v==V) break;
used[v]=true;
for(m=0;m&lt;V;m++)
{
d[m]=min(d[m],d[v]+cost[v][m]);
}
}
for(i=0;i&lt;V;i++)
{
cout&lt;&lt;"the shortest distance between "&lt;&lt;n&lt;&lt;" and "&lt;&lt;i&lt;&lt;" is "&lt;&lt;d[i]&lt;&lt;endl;
}
}

10.最小生成树算法

设一个网络表示为无向连通带权图G =(V, E) , E中每条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树的代价是指生成树上各边权的总和,在G的所有生成树中,耗费最小的生成树称为G的最小生成树。例如在设计通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][w]表示建立城市v和城市w之间的通信线路所需的费用,最小生成树给出建立通信网络的最经济方案。

构造最小生成树的Kruskal算法和Prim算法都利用了MST(最小生成树)性质:设顶点集U是V的真子集(可以任意选取),如果(u,v)∈E为横跨点集U和V—U的边,即u∈U,v∈V- U,并且在所有这样的边中,(u,v)的权c[u][v]最小,则一定存在G的一棵最小生成树,它以(u,v)为其中一条边。

使用反证法可以很简单的证明此性质。假设对G的任意一个最小生成树T,针对点集U和V—U,(u,v)∈E为横跨这2个点集的最小权边,T不包含该最小权边<u, v>,但T包括节点u和v。将<u,v>添加到树T中,树T将变为含回路的子图,并且该回路上有一条不同于<u,v>的边<u’,v’>,u’∈U,v’∈V-U。将<u’,v’>删去,得到另一个树T’,即树T’是通过将T中的边<u’,v’>替换为<u,v>得到的。由于这2条边的耗费满足c[u][v]≤c[u’][v’],故即T’耗费≤T的耗费,这与T是任意最小生成树的假设相矛盾,从而得证。

Prim算法每一步都选择连接U和V-U的权值最小的边加入生成树。

#include&lt;iostream&gt;
#include&lt;algorithm&gt;
#define MAX_V 100
#define INF 1000
using namespace std;  

int main()
{
int V,E;
int i,j,m,n;
int cost[MAX_V][MAX_V];
int mincost[MAX_V];
bool used[MAX_V];
cin&gt;&gt;V&gt;&gt;E;
fill(mincost,mincost+V+1,INF);
fill(used,used+V,false);
for(i=0;i&lt;V;i++)
{
for(j=0;j&lt;V;j++)
{
if(i==j) cost[i][j]=0;
else cost[i][j]=INF;
}
}
for(m=0;m&lt;E;m++)
{
cin&gt;&gt;i&gt;&gt;j&gt;&gt;cost[i][j];
cost[j][i]=cost[i][j];
}
mincost[0]=0;
int res=0;
while(true)
{
int v=V;
for(m=0;m&lt;V;m++)
{
if((!used[m])&amp;&amp;(mincost[m]&lt;mincost[v]))
v=m;
}
if(v==V) break;
used[v]=true;
res+=mincost[v];
for(m=0;m&lt;V;m++)
{
mincost[m]=min(mincost[m],cost[v][m]);
}
}
cout&lt;&lt;res&lt;&lt;endl;
} Kruskal算法每一步直接将权值最小的不成环的边加入生成树,我们借助并查集这一数据结构可以完美实现它。

关于贪心算法的基础知识就简要介绍到这里,希望能作为大家继续深入学习的基础。





先乘除后加减
如果有小括号的话先算小括号里面的然后再算乘除最后算加减

算法就是讲 如何将客观世界抽象成数据结构表示并运算的方法

1、先学好一种热门的编程语言基础,一定要精通;
2、学好数学,由浅入深,高等数学、线性代数、离散数学、概率论、数理统计、计算方法等等;
3、主要培养逻辑能力,可以去网上下载或参考经典算法题目的解法和思路,因为算数的部分计算机能搞定~
4、不要束缚自己的思维,头脑风暴一般,随意思考,算法想怎么写就怎么写,你会发现突然就写对了,但不知道为什么会对=。=


作为一个法学生如何学好法学
学习法学基础知识。学习法学基础知识是建立扎实法学基础的重要一步。包括宪法学、行政法学、刑法学、民法学、国际法学等方面的基础知识,深入学习各个法学分支的基本原理和法律规定。阅读法学经典著作。阅读经典的法学著作是拓宽法学视野、理解法学思想的有效途径。例如,读取《法的精神》、《法治论》、《论法...

我想学法律应该怎么入门
2、结合实践学习法。如果你能够有实践的机会,这个时候可以通过结合实践去学习,这样对于自己的理论知识的巩固也是非常有帮助的。3、主动安排学习计划。如果你是一名学生,平时还是建议自学法学,一定要安排一定的学习计划,这样学习起来才能够更加有目标和方向。4、具备坚持学习的决心。我们都知道法学的学习,...

如何学好法学
具体如下:1.入门很重要。刚开始接触法学,学的是法理学,或者是法理加宪法,比较枯燥,但对于法学入门、法律思维的培养至关重要,因此,这阶段一定要坚持,把基本功做好。2.多看案例、法制节目。图书馆有很多相关书籍,有条件的还可以看诸如《今日说法》的法制节目,将自己的观点与书中或节目中的观点...

自学法律该怎么开始
3、获取学习资源:寻找合适的学习资源,包括法律书籍、在线课程、讲座、博客等。可以到当地图书馆或网上寻找合适的资源,也可以参加法律学习群组,与其他学习者进行讨论和交流。4、系统地学习:法律知识非常广泛且复杂,建议按照主题和时间线进行系统地学习。例如,可以从民法、刑法、行政法、民诉、刑诉等基础...

普通人怎么自学法律
先从常用的法律入手,比如民法,民法就是人所能理解的一些道理,所以好懂一些,通过查法学词典逐渐开通法律术语,积少成多。再学一些程序法和专门法,比如民事诉讼法,劳动法,劳动合同法,看你的兴趣了。多学一些现行的司法解释。学法律的意义:首先要考虑就业,法律专业就业的选择不外乎行政司法机构如...

自学法律该怎么开始
自学法律该怎么开始,如下:1.确定你的学习目标和计划 首先,你需要确定你想学什么,以及你打算如何学习。你可以选择学习法律的某个领域,比如民法、刑法、行政法等等。2.选择适合你的法律教材 为了更好地学习法律,你需要选择适合你的教材。你可以选择学习法律的某个领域,比如民法、刑法、行政法等等。3...

怎么学习法律
介绍下我听得哪些老师的课,民法钟秀勇,刑法刘凤科,行政法徐金桂,商经鄢梦萱,刑诉杨雄,民诉郭翔等等。比如钟秀勇,刘凤科,就是民刑届的大神,讲的特别好,特别透彻,听他们的课真是一种享受。如果自己看不进去书,那就多去听听他们的课,不会枯燥不会烦感。三,多做题,看案例。如果学习法律是为了...

如何学习法律?
第二:多看多读多实践,宪法、刑法、民法、经济法劳动和社会保险法、婚姻法、行政法、知识产权法等都要了解甚至是精通,只有融会贯通各门知识才能让你在真正处理法律问题的时候从容不迫。除了法律领域以外的各个科目也都有一定的知识,比如说经济学、文学、甚至哲学都可以有一定的了解,这些知识可能看起来...

想学法律知识怎么学?
1、首先要学习法律知识,那么就要知道自己不是专业的法律人才,没有必要系统地学习法律知识,建议大家可以买一些法律书籍,像《民法典》就是我们日常最为密切的法律。2、其次就是可以在电视上面多看看《今日说法》这个节目来促进自己对于法律的认知和自我看法的养成。3、还有就是法律频道,我们多看看以往的...

我想自己学习法律应该怎么入门?
二,法律门科 主要为三大法和三大诉讼法,包括民法,刑法,行政法,民事诉讼法,刑事诉讼法,行政诉讼法。 还有就是一些部门法,如宪法,商法,经济法等等约10门左右。 三,是否必须都会 如果仅是感兴趣,学习基本法律即可。如果是以后想通过司法考试取得律师资格应该是不仅学会,而且学精。 初学...

蓬安县15063831789: 怎么学习算法 -
西要牛黄: 1、先学好一种热门的编程语言基础,一定要精通;2、学好数学,由浅入深,高等数学、线性代数、离散数学、概率论、数理统计、计算方法等等;3、主要培养逻辑能力,可以去网上下载或参考经典算法题目的解法和思路,因为算数的部分计算机能搞定~4、不要束缚自己的思维,头脑风暴一般,随意思考,算法想怎么写就怎么写,你会发现突然就写对了,但不知道为什么会对=_= 希望对你有帮助

蓬安县15063831789: 如何学习算法?本人一大三学生,非计算机专业.想自学下计算机算法,哪位大神能给指条明路? -
西要牛黄: 不知道你想要什么样的满意答案,大家只能给你思路,不可能给你书单.我觉得,语言是初期的,而算法不是 所以第一件事应该是学好一种语言 既然你已经学了java,已经能够解决很多问题了,比如在学java的时候一定会碰到些排序算法,以及...

蓬安县15063831789: 怎么学习函数算法? -
西要牛黄: 老师上课务必要认真听,因为这个知识非常重要,每次考试肯定会涉及到. 要记住各种函数的表达式,图像,还有当图像怎么移动时函数表达式会怎么变化…… 当一个点在函数图像上时,要善于把这个点代入到函数表达式中…… 其实说的越多还不如上课好好听,落实每一个知识点,加油哦! ——男孩/jump

蓬安县15063831789: 如何学好算法 -
西要牛黄: 数学不是必须学好的,但是学好数学对理解和编写算法特别有用的; 至于学习编程,需要一下三点(个人见解,仅供参考): 学习,思考,练习; 学习(也就是看书读资料)需要尽可能快速; 思考是必不可少的,思考了才能理解创新; 练习是思考付诸实践的证明,只有多动手练习,才能真正掌握一些技术和技能.

蓬安县15063831789: 算法到底应该怎么学 -
西要牛黄: 很多人都会说"学一样东西难",一开始我也觉得很大程度是因为每个人的智力水平等等不可改变的因素. 但是后来我发现,有一个东西也很能决定一个人是否会觉得一样东西难学,那就是理解方式.一件事物通过不同的途径让一个人理解效果差...

蓬安县15063831789: 算法学习应该如何下手 -
西要牛黄: 算法学习就是应该先把一些经典的算法搞懂,然后再形成自己的思维,最好是先搞一本书来看一下,这个要自己慢慢摸索的.

蓬安县15063831789: 高中新课标《数学必修3》第一章算法怎么学.知识探究 -
西要牛黄:[答案] 算法这一部分在高考中要求不高,在选择和填空中考,选择一般就考按照程序赋值后结果或者大于号、小于号的问题.填空就是考结果.都比较简单,是必得分,当然也不排除一些小小创新,总之万变不离其中,抓住课本,不要求设计程...

蓬安县15063831789: 怎样才能学好算法呢? -
西要牛黄: 算法不太好学,可以看本书《算法导论》还有想学好算法,数据结构必须有一定基础因为很多算法是基于特定的数据结构之上的

蓬安县15063831789: 最好的学习计算机算法的途径是什么? -
西要牛黄: 算法注重实践,要想全面而深入的学习算法,最好针对某一种语言(C/C++/C#等等)买一本计算方法的书,进行系统的学习,要理论结合实际.每一类型的算法,都会应用于编程当中,最重要的是理解,到编程的时候应用这些算法来就自然会得心应手了

蓬安县15063831789: 计算机不同的算法怎么学习效果好? -
西要牛黄: 算法通常和数据结构相结合,学习算法学的是一种思想,一种解决问题的方法,所以可以使用伪代码的方式学习

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网