A. 计算机专业学算法的都学些什么算法,有什么书可以看的学的话需要些什么基础的
计算机算法非常多的
A*搜寻算法
俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
Beam Search
束搜索(beam search)方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k个最好的路径,仅从这k个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70年代中期首先被应用于人工智能领域,1976 年Lowerre在其称为HARPY的语音识别系统中第一次使用了束搜索方法。他的目标是并行地搜索几个潜在的最优决策路径以减少回溯,并快速地获得一个解。
二分取中查找算法
一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。这种搜索算法每一次比较都使搜索范围缩小一半。
Branch and bound
分支定界(branch and bound)算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。
数据压缩
数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。数据压缩在文件存储和分布式系统领域有着十分广泛的应用。数据压缩也代表着尺寸媒介容量的增大和网络带宽的扩展。
Diffie–Hellman密钥协商
Diffie–Hellman key exchange,简称“D–H”,是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
Dijkstra’s 算法
迪科斯彻算法(Dijkstra)是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger Wybe Dijkstra)发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离,迪科斯彻算法可以用来找到两个城市之间的最短路径。
动态规划
动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较着名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。这里也有一篇文章说得比较详细。
欧几里得算法
在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
最大期望(EM)算法
在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。最大期望算法经过两个步骤交替进行计算,第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化(M),最大化在 E 步上求得的最大似然值来计算参数的值。M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。
快速傅里叶变换(FFT)
快速傅里叶变换(Fast Fourier Transform,FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
哈希函数
HashFunction是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
堆排序
Heapsort是指利用堆积树(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父结点。
归并排序
Merge sort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
RANSAC 算法
RANSAC 是”RANdom SAmpleConsensus”的缩写。该算法是用于从一组观测数据中估计数学模型参数的迭代方法,由Fischler and Bolles在1981提出,它是一种非确定性算法,因为它只能以一定的概率得到合理的结果,随着迭代次数的增加,这种概率是增加的。该算法的基本假设是观测数据集中存在”inliers”(那些对模型参数估计起到支持作用的点)和”outliers”(不符合模型的点),并且这组观测数据受到噪声影响。RANSAC 假设给定一组”inliers”数据就能够得到最优的符合这组点的模型。
RSA加密算法
这是一个公钥加密算法,也是世界上第一个适合用来做签名的算法。今天的RSA已经专利失效,其被广泛地用于电子商务加密,大家都相信,只要密钥足够长,这个算法就会是安全的。
并查集Union-find
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
Viterbi algorithm
寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states)。
B. 如何学习算法本人一大三学生,非计算机专业。想自学下计算机算法,哪位大神能给指条明路
不知道你想要什么样的满意答案,大家只能给你思路,不可能给你书单。
我觉得,语言是初期的,而算法不是
所以第一件事应该是学好一种语言
既然你已经学了java,已经能够解决很多问题了,比如在学java的时候一定会碰到些排序算法,以及类似汉诺塔一类有趣的算法——更重要的是你得实际的试试这些小程序
然后学好数据结构,如果想理解和应用[图]的算法,像队列、栈、树都得滚瓜烂熟吧?(树相关的算法也不少)
我不知道java实现的数据结构哪本书比较好,但是数据结构的书应该也不会相差太多吧,这个科目的写作已经很成熟了,你应该自己能找到。CSDN也有很多高手写类似博文。
要是真学好了数据结构(不跳过任何难的章节,对每段代码都亲身实践、烂熟),你掌握的算法就很了不得了-说实话计算机专业的人又有几人能做到这点...
关于《算法导论》(可能是让你觉得“感觉学了半天没有真正的学到知识”的其中之一),学数据结构的时候可以一块儿看 - 网易有公开课呢,连老师都有了。但重要的是多多把算法敲出来...
另外不得不说,ACM的题库可以增加学习的乐趣 ~ 最好买那些给出详解的书
计算机图形学里有很多算法-多数计算机图形学的书都是用c++的..
《计算机图形学》有国内老师写的也有国外的:国内的正规教材倾向于走马观花,没什么重点只是覆盖知识(我是在说清华大学出版社的几本);国外经典的书大多是大部头,动辄600页里面还有大量数学分析。前者适合自学去了解相关领域的知识(你还能在网上找到相关的题和答案呢..)。后者不太容易懂,太数学了..
个人觉得如果学算法是为了研究、创造更好的算法,比如你下定了决心去编比Maya的某海浪功能更好的插件,那一定要好好读这些经典大部头。但如果是为了用,那就不必要。
完成上一步,起码对自己专业更了解了。说不定过程中你找到了特别感兴趣的方向-比如分形,比如用openGL或webGL做些小东西,比如你想要研究粒子,想研究物理碰撞,图形实时交互...有很多书就是专题讲这些的,也有很多网站、爱好者的圈子,你知道该如何提升。
C. 怎么学习算法
1、先学好一种热门的编程语言基础,一定要精通;
2、学好数学,由浅入深,高等数学、线性代数、离散数学、概率论、数理统计、计算方法等等;
3、主要培养逻辑能力,可以去网上下载或参考经典算法题目的解法和思路,因为算数的部分计算机能搞定~
4、不要束缚自己的思维,头脑风暴一般,随意思考,算法想怎么写就怎么写,你会发现突然就写对了,但不知道为什么会对=_=
希望对你有帮助