结构化算法是由一些基本结构顺序组成的,就是把一个大的功能的实现分隔为许多个小功能的实现。在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本的结构范围内。一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。这样的好处是可以将复杂问题简单化,让编程更容易,提高代码维护和可读性。
跟结构化算法比较起来,非结构化算法有以下缺点。
流程不受限制的随意转来转去,使流程图豪无规律。使人在阅读的时候难以理解算法的逻辑。难以阅读,也难以修改。从而使算法的可靠性和可维护性难以保证。
我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(如元素的CURD、排序等)而执行的相应操作,这个相应的操作也叫算法。
数据结构=元素+元素的关系;算法=对数据结构的操作;
算法:算法就是:解决问题的方法和步骤;
如计算机内存中栈和堆的区别,不懂数据结构的人可能会认为内存就是分两大部分,一块叫栈,一块叫堆,显然这是非常肤浅且不正确的结论。
实际上如果一块内存是以压栈出栈的方式分配的内存,那么这块内存就叫栈内存,如果是以堆排序的方式分配的内存,那么这块内存就叫堆内存,其最根本的区别还是其内存分配算法的不同。
例如,函数的调用方式也是通过压栈出栈的方式来调用的,或者操作系统中多线程操作有队列的概念,队列用于保证多线程的操作顺序,这也是数据结构里面的内容、或者计算机编译原理里面有语法树的概念,这实际上就是数据结构里面的树,比如软件工程、数据库之类都有数据结构的影子。
在计算机系统中,CPU可以直接操作内存,关于CPU对内存的操作与控制原理可以简单理解如下图:
地址线:确定操作哪个地址单元
控制线:控制该数据单元的读写属性
数据线:传输CPU和内存之间的数据
什么叫结构体:结构体是用户根据实际需要,自己定义的复合数据类型
指针:
指针就是地址,地址就是指针。
指针变量是存放内存单元地址的变量,它内部保存的值是对应的地址,地址就是内存单元的编号(如内存地址值:0xffc0)。
指针的本质是一个操作受限的非负整数
引用Quora上的回答:
IseeittimeandagaininGoogleinterviewsornew-gradhires:Thewaydatastructuresandalgorithms—amongthemostimportantsubjectsinapropercomputersciencecurriculum—arelearntisofteninsufficient.That‘snottosaystudentsreadthewrongbooks(seemyrecommendationbelow)orprofessorsteachthewrongmaterial,buthowstudentsultimatelycometounderstandthesubjectislacking.(我多次在google面试或者毕业招聘的时候看到这样的情形:学习数据结构和算法--CS课程里面几乎最重要的课程--的方式很不科学!!到不是说大家用的书或者老师用的材料不对,而是说学生们对于这些课程本身的理解非常缺乏。)
Thekeytoasolidfoundationindatastructuresandalgorithmsisnotanexhaustivesurveyofeveryconceivabledatastructureanditssubforms,withmemorizationofeach’sBig-Ovalueandamortizedcost.Suchknowledgeisgreatandimpressiveifyou‘vegotit,butyouwillrarelyneedit.Forbetterorworse,yourcareerwilllikelyneverrequireyoutoimplementared-blacktreenoderemovalalgorithm.Butyououghtbeable—withcompleteease!—toidentifywhenabinarysearchtreeisausefulsolutiontoaproblem,becauseyouwilloftenneedthatskill.(打好数据结构和算法基础的关键并不在于对于所有数据结构的细致的了解,不是记住每一个大O值或者摊余成本。.)。
如果这些知识你都掌握了,当然很棒并且可以给人留下很深的印象,但是你基本上用不着啊!
你的职业生涯中或许永远都不会要求你实现一个红黑树删除节点的算法。但是!你必须有能力而且手起刀落轻轻松松的识别出什么时候使用二叉树更简单更有效,因为你十分需要这样的技巧。)
Sostoptryingtomemorizeeverything.Instead,startwiththebasicsandlearntodotwothings:
Visualizethedatastructure.Intuitivelyunderstandwhatthedatastructurelookslike,whatitfeelsliketouseit,andhowitisstructuredbothintheabstractandphysicallyinyourcomputer’smemory.Thisisthesinglemostimportantthingyoucando,anditisusefulfromthesimplestqueuesandstacksupthroughthemostcomplicatedself-balancingtree.Drawit,visualizeitinyourhead,whateveryouneedtodo:Understandthestructureintuitively.
Learnwhenandhowtousedifferentdatastructuresandtheiralgorithmsinyourowncode.Thisisharderasastudent,astheproblemassignmentsyou‘llworkthroughjustwon’timpartthisknowledge.That‘sfine.Realizeyouwon’tmasterdatastructuresuntilyouareworkingonareal-worldproblemanddiscoverthatahashisthesolutiontoyourperformancewoes.Butevenasastudentyoushouldfocusonlearningnottheminutiadetailsbutthepracticalities:Whendoyouwantahash?Whendoyouwantatree?Whenisamin-heaptherightsolution?
(所以,不要试图记住所有的东西。而是从基础开始,做两件事:
第一件事。把数据结构图形化,视觉化。(突然想起来我高中竞赛老师说的一句话:数形结合千般好,一旦不做万事休啊!就是要画图!)在直觉上感受一个数据结构是什么样子的。使用它是什么感觉,抽象上和具体实现上是什么样子的。这就是最重要的事情。并且无论是对于简单的队列,栈还是天杀的平衡树都很重要而且有效。把数据结构画出来,在你的脑袋瓜里面就能想象出来,总之,你需要做的就是,直观的去了解这些数据结构。
第二件事。学习什么时候用什么样的数据结构和算法。对于学生来说这很难,而且你要做作业的时候老师也没告诉你们这该怎么办。不过没关系。你要认识到当你真正处理到现实问题的时候或许你才能掌握某些数据结构,比如哈希表。但是即使是个学生,你也应该知道数据结构的实用性:什么时候你需要个哈希表,什么时候你需要个树,什么时候你需要个堆?而不是一开始就陷入到追求细节中去。)
OneofthequestionsIaskinGoogleengineeringinterviewshasabinarysearchtreeasapotentialsolution(amongothers)。Goodcandidatescanarriveatthebinarysearchtreeastherightpathinafewminutes,andthentake10-15minutesworkingthroughtherestoftheproblemandtheotherroadblocksItossout.ButoccasionallyIgetacandidatewhointuitivelyunderstandstreesandcanvisualizetheproblemI‘mpresenting.Theymightstumbleontheexactalgorithmiccomplexityofsomeoperation,buttheycanrespondtoroadblockswithoutpausebecausetheycanvisualizethetree.Theygetit.
Asforabook,thereisbutone:IntroductiontoAlgorithmsbyCormen,Leiserson,Rivest,andStein,otherwiseknownasCLRS.
至于书,只推荐一本---《算法导论》
Ifyouwantanothertext,perhapsonewithmoreexamplesinaspecificlanguage,IrecommendRobertSedgewick’sAlgorithmsinC++orAlgorithmsinJava,asappropriate.IpreferCLRSasatext,butyoumightfindtheseabetterteachingaid.
1、理解该数据结构的基本概念(定义、实现)
2、尝试理解这个数据结构的意义(为什么它会被发明)
3、用这种数据结构解决一些对应的例题(书本上的习题、OnlineJudge上的水题)
4、尝试用这个数据结构解决一些以往你用别的数据结构解决的问题,能否解决,为什么。
5、再次尝试理解这个数据结构的意义
6、尝试改变这个数据结构以应对各种现实的问题(OnlineJudge的好题)
7、学好数学,别数都不会数。
初级篇
记住都有哪些算法,解决什么问题
去试图解决实际的问题,自然会碰到之前算法解决的问题,使用这些算法
中极篇
先完成初级篇
记住算法的具体解决办法
实际的问题如果有与标准算法相似但是不完全一样的,仔细分析差别,修改原有算法
高级篇
先完成中极篇
分析一下算法的解决办法是如何才能想到,最核心和最精妙的地方在哪儿
实际的问题如果与标准算法都不太象,仔细想想这个问题的本质,借鉴经典算法精妙之处,自己设计自己要用的算法