当思想开始回朔的时候
当思想开始回朔的时候------你会从语言层次回到一种平凡但有伟大的高度上,语言的平台依赖性就变得更加趋向于0!!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/about_character_mode_applications.asp
从Console开始--->.......--->回朔到Console(进一步了解到:数据结构和算法,设计模式,操作系统内核对象..)
(1)从精神高度上做好了能够游走于2个主流平台的思想准备工作:WINDOWS平台,LINUX平台
(2)操作系统内核对象的本质是什么?以怎样的数据结构组织,必须为相应的数据结构设计哪些算法,
(3)[代码中心说] 最后你的应用程序要具有什么样的LayOut方式,业务逻辑层(BLL)按照3层来分割后
形成的UML描述的class Graph应该对应的有3层,这些类是要你自己写,还是说要
从某个厂商提供的类库中的某些个类中派生出来(其实:任何的厂商提供的类库
都有一个非常紧密的最小化组织形式,如:某种类型的应用程序必须要有哪几个类;
而除此最小化组织形式外,在任何类库的Hirarchy Chart中的其它类都是以一种集合
的“松散方式”存在的,)
(4-1)西方人的文化决定了他们思考这样的问题的方式像《圣经》中那样,上帝说:要有光,于是有了光!!改而说之--->上帝说:要有窗口,于是有了窗口!!上帝说:要有工具条,于是有了工具条!!上帝说:要有菜单,于是有了菜单!!上帝说:要有属性Sheet,于是有了属性Sheet!!上帝说:要用TAB标签页来对你的应用程序进行布局,所以有了TAB!!。。。。
(4-2)中国人怎么想上面的问题??---------父母是一层天!/龙生龙,凤生凤,老鼠的儿子会打洞!......
(5)上面从2个角度描述了西方人和中国人同样的思考问题的方式:
除了你使用向导生成的最小化的CLASS体系架构之外,你需要什么功能:
(A)是改善你的应用程序的LayOut,你就去找CDC或更为具体的GDI类;你需要使用Control,你就去
找更为具体的类库提供的Control类;使用任何第3方提供的具体的某个什么样的CLASS,你直
接从它们派生出来你自己的类就好了---------剩下的问题就是:你需要在什么场合/情况下/什么
事件发生/时间到达的时候让它们呈现出来,这个问题就很好解决了,因为任何的CLASS或者
你派生的CLASS其实在编程时使用的时候是非常松散的集合结构(就想JJHOU比喻的那样:
像从超级市场里面采购CLASS,然后要么直接使用,要么稍做加工形成你的派生CLASS)
之所以可以这样做的前提是:你已经按照MSDN或者其他的产品文档或者说明,包含上了相应
的头文件,引入了要使用的*.dll文件和*.lib文件。
得到的结果就是:以类组织的形式(不管这个CLASS是不是和其他的CLASS位于一组同样的
*.h + *.cpp 文件中),你可以在任何时候,任何地方调用它们的构造函数动态的把它们创建
出来(注意:这个是“函数/某个具体类的成员函数的作用域的”)
(B)从UML(设计模式)的角度讲:必须按照按照一组文件(*.h + *.cpp)的形式把同类模块的
所有CLASS组织起来(说白了,就是:作为窗口零件功能的几个类,如:CRectangle,
CCircle,CSquete,......必须写在同一组文件[*.h + *.cpp]中)//这样,维护和修改都非常容易!!
如果你把它们组织到同一个namespace下面,同样很好,不过是多加了1层,并且能够带来的
好处是:团队开发的时候,使用起来更容易,不会导致命名冲突!!(推荐加上这层)
实际上:JAVA和.NET团队开发的时候,除了有先制定好的命名规范和代码风格和注意事项
之外;各个项目小组(专门负责开发某个模块功能的小组,如:开发Web Control
的小组/个人,开发Windows Control的小组/个人-------他的项目经理/项目组长都会
给他一张纸:上面规定了诸如命名空间的名字是什么,你至少要写多少个
CLASS,时间进度表,BUG报告和修改升级的任务以后都是你的任务;如果你要离
开了,你必须把前面你实现的部分的内容对新来的员工做好交接工作-------但是,
如果你是新来的员工:
1.你必须根据产品做一些判断:
(1)这个产品是什么技术构建的(VC/JAVA/.NET);采用B/S结构,还是C/S结构
(2)这个系统大致分成哪些模块儿,你负责哪个模块(或者该模块中的哪个部分)
2.你还必须问他下面的一些问题:
(1)问他要一份公司的编码标准的文件(先放起来,随后再看)
(2)问他要他负责的模块的代码(要求他边展示,边讲解:namespace, class)
(3)问他自己写的没有从任何类派生出来的CLASS有多少,是什么,完成何功能
其中的每个成员函数又是完成什么功能的,详细的细节(特别是:这些代码
完成设备驱动功能,图象捕捉功能,音频/视频功能---不懂的地方要问清楚)
//剩下那些他从某个具体的类库中的类派生出来的CLASS可以少问或者不问
//因为,如果注释写的语意是清晰的,这些能从注释看出来(注释要分2类,都要写)
//shanzy: --------VS.NET中有这个功能,如果CLASS是你自己写的,最好这样标记
一下,这样查看/维护/给别人讲解的时候都很容易抓到重点
//功能注释------完成某个模块的的什么功能
//ADT注释------利用什么数据结构来实现什么功能(是存储功能,还是结构功能)
//ADT内部的成员函数的注释-------此成员函数要实现的是什么算法
(因为,有的人的代码风格和你自己的不同,写出来的算法很难一眼看出来是要
干什么的;另外,算法对应的函数名不能望文生意或者望文生出来的是歧义
的话-----都会给理解和维护造成困难和误导!!)
(4)如果他用别的什么UML工具做了CLASS GRAPH图的话(你要求看)
(5)假设他负责的命名空间是: company.devlop.gui.webcontrol;
他负责实现20个类,分别是:StaticText, Button, Dialog and ChildWnd, ComboBox,
ListBox, Menu, Toobar, Docking Window, Status Bar, Edit Control, List Control, Tree
Control, Tab Control, Property Sheet, Rich Edit Control, Splitter Windows,
Miscellaneous Controls...... //当然,这里要假设这些东西是作者自己写出来的
//而不是从类库中继承然后加以改造的部分-------详细在下面描述:
如果深入到系统内核对象的编写(包括:自己写原始的数据结构和相应的算
法),像上面的那个----你自己写的而不是派生的ADT和算法到底有多少是一定
要问的一个问题 。因为,从编程的角度来讲,内核对象才是最小,最内层的
那个圆,之后用CONSOLE来表现,还是使用WINDOWS GUI控件表示,还是
使用WEB GUI 控件表示,都只是表现形式的不同而已!!
针对内核对象编写具体的ADT和算法的例子可以看JJHOU的《STL原码分析》
中的那个“内存配置器”CLASS的写法;这个例子的思想非常重要,因为任何
的内核对象都要用到内存分配,而写这样一个CLASS可以提供给任何对象使用
当然,也可以从这个例子展开,像MSDN中的集合类LIST(双向链表)一样,
这种独体类最好使用template技术,而且你至少要写4个类别情况:
像MSDN中就有:CList(template化的),CPtrList(针对指针的),CObjList(针对
对象的),CStringList(针对字符串的)
还有MSDN中的Hirarchy Chart 的MAPS集合中也有很多具体的Map类,你如果自
己写这些类型的话,当然也要想要至少要提供像MSDN中那么多的组合
(C)数据结构的研究方法和算法设计时KI原则(《具体数学》上KNUTH提到的另一位数学
家/计算机科学家--------它提出了:任何的算法设计都要首先考虑访问越界,没有访问
到/通过malloc()或者new来分配内存空间的时候,要把分配内存的代码写在if-else的if中;)
这个原则不是机械论,八股论,而是一种科学的方法
(D)任何的算法都只有3类:创建,销毁(直接对应:构造和析构,可能有多个重载的构造
函数,这些构造函数可能使用“缺省参数”,可能使用“初始化成员列表”,等内容)
编历(基于编历可以按照对数据元素操作行为的不同分2个方向:引用型操作集合,
加工型操作集合)
//引用型操作集合中可以整和WIN32API的句柄,结构体,和分类的各种WIN32API来
//写出你的使用WIN32API的GUI图形应用程序(可以分成很多种类的:侧重本地的,
//侧重网络的)---------MSDN的PLATFORM SDK中有详细的WIN32API分类;
//数据在内存中如何进行组织是你自己要完成的功能:你可以按照《数据结构》书上的
//结构来组织数据元素,当然,你也可以使用STL中现成的各种具体的数据结构来组织
//数据元素(程序代码的具体形式可能不同,但核心问题或者说函数名代表的算法要
//完成的任务和ADT具体是那种类型[链表,双链表,栈,队列,优先级队列,循环队
//列,二叉树, n叉树,AVL树,Huffman树,B树,B+树)
树型结构比链式结构的最明显区别就是:
树的深度通常是:logb(n) --------其中,b表示该树中实际参与递归的时候的指针的个数(分了几叉出去)
而树的深度通常是和遍历时做的比较的次数,反映到程序上就是for(初始表达式;终止表达式;步长值)等的
“遍历的元素的个数 = 终止表达式 - 初始表达式”
说白了:树型结构比链式结构最大的特点就是“用空间换时间”
显然,可以用任何更高级的ADT来实现稍微或更低的ADT想要实现的任何引用型操作和加工型操作
至于要不要采用更高级的ADT,有下面几个考虑:
(1)开始的时候,问题的规模n是很大的(如:你要处理100000000000条记录),遍历和基于遍历的算法会
被频繁的调用,而如果采用链式的(像:单链表),显然是不行的,因为它的时间复杂度始终是n;而采用
树型结构则可以把时间复杂度降到logb(n),并且树型结构在n越大的时候,体现出来的算法的速度越快
(2)并不是问题的规模n非常大(如:100000000条记录)就一定要采用树型结构来做;是要有前提的
假想用10000*10000的矩阵来存储这些100000000条记录---------设计算法时,首先要进行估计和指定对
特殊字段的特殊处理策略(比如:用户登记信息时,非必填的那些内容为0或者NULL),而你除了要使用
KI原则设计做出必须要做的处理之外,还要用KI原则做出一些对特殊字段的特殊处理工作
====>任何的非构造和析构算法中都应该保持至少2类if-else语句块儿:
第1类:就是针对ADT失效的各种情况(前面说过,此处省略)
第2类:针对为0或NULL和其他一些特殊的数据进行处理的情况(这里要用到“数据压缩”的思想)
特殊,如上面采用矩阵形式存储叫做“矩阵的压缩存储”来表达数据压缩的特殊形式
可以看《数据结构》----------矩阵压缩存储那一章
思想的根本就是:为使用笛卡儿叉积描述的数据的原始存储形式(不管是:数组,文件,数据库中的表)
你的算法中如果要对特殊数据进行遍历和基于遍历的各种操作(加工型和引用型),它必然的方向只有
2中:从数组/文件/数据库的表中读到内存中,从内存中写到数组/文件/数据库的表
,,,,,,,,,,,,,,,,,,,,,,,,//一会儿回来写
===>用任何高级的ADT也不是乱用的:用它首先关注的是它的时间复杂度比链式的小,提高各种算法速度;
另外也要考虑尽可能把空间也全部利用上
说白了就是:又要马儿跑得快,又要马吃进肚子的草包(像游戏里面的能量瓶一样)全是满的
上面的从控制理论来讲:目的就是要时间最少,目的之二是“空间最好全用上”
,,,,,,,,,,,,,,,,,,,,,,,,,,//回来写
(3)任何的ADT都是前人提出的“待解决的问题规模的n适当的时候”的一种最佳解决方案(局部最优)
有的时候,常见的数据结构ADT无法实现你想要的效果,则:你需要自己设计一种新的数据结构来解决问题
当然,这种情况是会发生的,不过概率很小,只是因为你对更高级的数据结构ADT了解的还比较少,或者
了解的深度不够导致的使用的时候影响了你的开发速度和编码速度!!!!!!!!!!
(4)能用数学或者其他的公式算出来的东西,如果你通过调用相关的数学函数或者其他的专业书籍上的
计算公式来算的化,通常是比较浪费时间的
======>解决方法是:(查找表)
可以先写一个小的程序,把你的程序要用到的所有的东西先算出来,然后把这些你需要用到的
东西直接用在程序中
(5)为什么说:人们发明树型结构是用来存储和搜索海量数据的??
要从3个方面说:
第1:前面已经说过----------只有在问题规模n非常大的时候,才体现出来树型结构的时间和空间复杂度的性能
比链式结构要好
第2:搜索/遍历和基于遍历的任何算法(加工型和引用型)===>树型结构是非常好的搜索模型(ADT)
第3:从单链表的ADT定义来看,只有2个节点的单链表只能存储规模为2的数据;而二叉树ADT的定义,反映
出2个节点时,树型结构可以存储规模为3的数据了
============================================
树的面积的计算:
问题的总规模-------------------树的逻辑 。。。。。。。。。。。//回来写
终于打开了“潘多拉盒子”!!!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/about_character_mode_applications.asp
从Console开始--->.......--->回朔到Console(进一步了解到:数据结构和算法,设计模式,操作系统内核对象..)
(1)从精神高度上做好了能够游走于2个主流平台的思想准备工作:WINDOWS平台,LINUX平台
(2)操作系统内核对象的本质是什么?以怎样的数据结构组织,必须为相应的数据结构设计哪些算法,
(3)[代码中心说] 最后你的应用程序要具有什么样的LayOut方式,业务逻辑层(BLL)按照3层来分割后
形成的UML描述的class Graph应该对应的有3层,这些类是要你自己写,还是说要
从某个厂商提供的类库中的某些个类中派生出来(其实:任何的厂商提供的类库
都有一个非常紧密的最小化组织形式,如:某种类型的应用程序必须要有哪几个类;
而除此最小化组织形式外,在任何类库的Hirarchy Chart中的其它类都是以一种集合
的“松散方式”存在的,)
(4-1)西方人的文化决定了他们思考这样的问题的方式像《圣经》中那样,上帝说:要有光,于是有了光!!改而说之--->上帝说:要有窗口,于是有了窗口!!上帝说:要有工具条,于是有了工具条!!上帝说:要有菜单,于是有了菜单!!上帝说:要有属性Sheet,于是有了属性Sheet!!上帝说:要用TAB标签页来对你的应用程序进行布局,所以有了TAB!!。。。。
(4-2)中国人怎么想上面的问题??---------父母是一层天!/龙生龙,凤生凤,老鼠的儿子会打洞!......
(5)上面从2个角度描述了西方人和中国人同样的思考问题的方式:
除了你使用向导生成的最小化的CLASS体系架构之外,你需要什么功能:
(A)是改善你的应用程序的LayOut,你就去找CDC或更为具体的GDI类;你需要使用Control,你就去
找更为具体的类库提供的Control类;使用任何第3方提供的具体的某个什么样的CLASS,你直
接从它们派生出来你自己的类就好了---------剩下的问题就是:你需要在什么场合/情况下/什么
事件发生/时间到达的时候让它们呈现出来,这个问题就很好解决了,因为任何的CLASS或者
你派生的CLASS其实在编程时使用的时候是非常松散的集合结构(就想JJHOU比喻的那样:
像从超级市场里面采购CLASS,然后要么直接使用,要么稍做加工形成你的派生CLASS)
之所以可以这样做的前提是:你已经按照MSDN或者其他的产品文档或者说明,包含上了相应
的头文件,引入了要使用的*.dll文件和*.lib文件。
得到的结果就是:以类组织的形式(不管这个CLASS是不是和其他的CLASS位于一组同样的
*.h + *.cpp 文件中),你可以在任何时候,任何地方调用它们的构造函数动态的把它们创建
出来(注意:这个是“函数/某个具体类的成员函数的作用域的”)
(B)从UML(设计模式)的角度讲:必须按照按照一组文件(*.h + *.cpp)的形式把同类模块的
所有CLASS组织起来(说白了,就是:作为窗口零件功能的几个类,如:CRectangle,
CCircle,CSquete,......必须写在同一组文件[*.h + *.cpp]中)//这样,维护和修改都非常容易!!
如果你把它们组织到同一个namespace下面,同样很好,不过是多加了1层,并且能够带来的
好处是:团队开发的时候,使用起来更容易,不会导致命名冲突!!(推荐加上这层)
实际上:JAVA和.NET团队开发的时候,除了有先制定好的命名规范和代码风格和注意事项
之外;各个项目小组(专门负责开发某个模块功能的小组,如:开发Web Control
的小组/个人,开发Windows Control的小组/个人-------他的项目经理/项目组长都会
给他一张纸:上面规定了诸如命名空间的名字是什么,你至少要写多少个
CLASS,时间进度表,BUG报告和修改升级的任务以后都是你的任务;如果你要离
开了,你必须把前面你实现的部分的内容对新来的员工做好交接工作-------但是,
如果你是新来的员工:
1.你必须根据产品做一些判断:
(1)这个产品是什么技术构建的(VC/JAVA/.NET);采用B/S结构,还是C/S结构
(2)这个系统大致分成哪些模块儿,你负责哪个模块(或者该模块中的哪个部分)
2.你还必须问他下面的一些问题:
(1)问他要一份公司的编码标准的文件(先放起来,随后再看)
(2)问他要他负责的模块的代码(要求他边展示,边讲解:namespace, class)
(3)问他自己写的没有从任何类派生出来的CLASS有多少,是什么,完成何功能
其中的每个成员函数又是完成什么功能的,详细的细节(特别是:这些代码
完成设备驱动功能,图象捕捉功能,音频/视频功能---不懂的地方要问清楚)
//剩下那些他从某个具体的类库中的类派生出来的CLASS可以少问或者不问
//因为,如果注释写的语意是清晰的,这些能从注释看出来(注释要分2类,都要写)
//shanzy: --------VS.NET中有这个功能,如果CLASS是你自己写的,最好这样标记
一下,这样查看/维护/给别人讲解的时候都很容易抓到重点
//功能注释------完成某个模块的的什么功能
//ADT注释------利用什么数据结构来实现什么功能(是存储功能,还是结构功能)
//ADT内部的成员函数的注释-------此成员函数要实现的是什么算法
(因为,有的人的代码风格和你自己的不同,写出来的算法很难一眼看出来是要
干什么的;另外,算法对应的函数名不能望文生意或者望文生出来的是歧义
的话-----都会给理解和维护造成困难和误导!!)
(4)如果他用别的什么UML工具做了CLASS GRAPH图的话(你要求看)
(5)假设他负责的命名空间是: company.devlop.gui.webcontrol;
他负责实现20个类,分别是:StaticText, Button, Dialog and ChildWnd, ComboBox,
ListBox, Menu, Toobar, Docking Window, Status Bar, Edit Control, List Control, Tree
Control, Tab Control, Property Sheet, Rich Edit Control, Splitter Windows,
Miscellaneous Controls...... //当然,这里要假设这些东西是作者自己写出来的
//而不是从类库中继承然后加以改造的部分-------详细在下面描述:
如果深入到系统内核对象的编写(包括:自己写原始的数据结构和相应的算
法),像上面的那个----你自己写的而不是派生的ADT和算法到底有多少是一定
要问的一个问题 。因为,从编程的角度来讲,内核对象才是最小,最内层的
那个圆,之后用CONSOLE来表现,还是使用WINDOWS GUI控件表示,还是
使用WEB GUI 控件表示,都只是表现形式的不同而已!!
针对内核对象编写具体的ADT和算法的例子可以看JJHOU的《STL原码分析》
中的那个“内存配置器”CLASS的写法;这个例子的思想非常重要,因为任何
的内核对象都要用到内存分配,而写这样一个CLASS可以提供给任何对象使用
当然,也可以从这个例子展开,像MSDN中的集合类LIST(双向链表)一样,
这种独体类最好使用template技术,而且你至少要写4个类别情况:
像MSDN中就有:CList(template化的),CPtrList(针对指针的),CObjList(针对
对象的),CStringList(针对字符串的)
还有MSDN中的Hirarchy Chart 的MAPS集合中也有很多具体的Map类,你如果自
己写这些类型的话,当然也要想要至少要提供像MSDN中那么多的组合
(C)数据结构的研究方法和算法设计时KI原则(《具体数学》上KNUTH提到的另一位数学
家/计算机科学家--------它提出了:任何的算法设计都要首先考虑访问越界,没有访问
到/通过malloc()或者new来分配内存空间的时候,要把分配内存的代码写在if-else的if中;)
这个原则不是机械论,八股论,而是一种科学的方法
(D)任何的算法都只有3类:创建,销毁(直接对应:构造和析构,可能有多个重载的构造
函数,这些构造函数可能使用“缺省参数”,可能使用“初始化成员列表”,等内容)
编历(基于编历可以按照对数据元素操作行为的不同分2个方向:引用型操作集合,
加工型操作集合)
//引用型操作集合中可以整和WIN32API的句柄,结构体,和分类的各种WIN32API来
//写出你的使用WIN32API的GUI图形应用程序(可以分成很多种类的:侧重本地的,
//侧重网络的)---------MSDN的PLATFORM SDK中有详细的WIN32API分类;
//数据在内存中如何进行组织是你自己要完成的功能:你可以按照《数据结构》书上的
//结构来组织数据元素,当然,你也可以使用STL中现成的各种具体的数据结构来组织
//数据元素(程序代码的具体形式可能不同,但核心问题或者说函数名代表的算法要
//完成的任务和ADT具体是那种类型[链表,双链表,栈,队列,优先级队列,循环队
//列,二叉树, n叉树,AVL树,Huffman树,B树,B+树)
树型结构比链式结构的最明显区别就是:
树的深度通常是:logb(n) --------其中,b表示该树中实际参与递归的时候的指针的个数(分了几叉出去)
而树的深度通常是和遍历时做的比较的次数,反映到程序上就是for(初始表达式;终止表达式;步长值)等的
“遍历的元素的个数 = 终止表达式 - 初始表达式”
说白了:树型结构比链式结构最大的特点就是“用空间换时间”
显然,可以用任何更高级的ADT来实现稍微或更低的ADT想要实现的任何引用型操作和加工型操作
至于要不要采用更高级的ADT,有下面几个考虑:
(1)开始的时候,问题的规模n是很大的(如:你要处理100000000000条记录),遍历和基于遍历的算法会
被频繁的调用,而如果采用链式的(像:单链表),显然是不行的,因为它的时间复杂度始终是n;而采用
树型结构则可以把时间复杂度降到logb(n),并且树型结构在n越大的时候,体现出来的算法的速度越快
(2)并不是问题的规模n非常大(如:100000000条记录)就一定要采用树型结构来做;是要有前提的
假想用10000*10000的矩阵来存储这些100000000条记录---------设计算法时,首先要进行估计和指定对
特殊字段的特殊处理策略(比如:用户登记信息时,非必填的那些内容为0或者NULL),而你除了要使用
KI原则设计做出必须要做的处理之外,还要用KI原则做出一些对特殊字段的特殊处理工作
====>任何的非构造和析构算法中都应该保持至少2类if-else语句块儿:
第1类:就是针对ADT失效的各种情况(前面说过,此处省略)
第2类:针对为0或NULL和其他一些特殊的数据进行处理的情况(这里要用到“数据压缩”的思想)
特殊,如上面采用矩阵形式存储叫做“矩阵的压缩存储”来表达数据压缩的特殊形式
可以看《数据结构》----------矩阵压缩存储那一章
思想的根本就是:为使用笛卡儿叉积描述的数据的原始存储形式(不管是:数组,文件,数据库中的表)
你的算法中如果要对特殊数据进行遍历和基于遍历的各种操作(加工型和引用型),它必然的方向只有
2中:从数组/文件/数据库的表中读到内存中,从内存中写到数组/文件/数据库的表
,,,,,,,,,,,,,,,,,,,,,,,,//一会儿回来写
===>用任何高级的ADT也不是乱用的:用它首先关注的是它的时间复杂度比链式的小,提高各种算法速度;
另外也要考虑尽可能把空间也全部利用上
说白了就是:又要马儿跑得快,又要马吃进肚子的草包(像游戏里面的能量瓶一样)全是满的
上面的从控制理论来讲:目的就是要时间最少,目的之二是“空间最好全用上”
,,,,,,,,,,,,,,,,,,,,,,,,,,//回来写
(3)任何的ADT都是前人提出的“待解决的问题规模的n适当的时候”的一种最佳解决方案(局部最优)
有的时候,常见的数据结构ADT无法实现你想要的效果,则:你需要自己设计一种新的数据结构来解决问题
当然,这种情况是会发生的,不过概率很小,只是因为你对更高级的数据结构ADT了解的还比较少,或者
了解的深度不够导致的使用的时候影响了你的开发速度和编码速度!!!!!!!!!!
(4)能用数学或者其他的公式算出来的东西,如果你通过调用相关的数学函数或者其他的专业书籍上的
计算公式来算的化,通常是比较浪费时间的
======>解决方法是:(查找表)
可以先写一个小的程序,把你的程序要用到的所有的东西先算出来,然后把这些你需要用到的
东西直接用在程序中
(5)为什么说:人们发明树型结构是用来存储和搜索海量数据的??
要从3个方面说:
第1:前面已经说过----------只有在问题规模n非常大的时候,才体现出来树型结构的时间和空间复杂度的性能
比链式结构要好
第2:搜索/遍历和基于遍历的任何算法(加工型和引用型)===>树型结构是非常好的搜索模型(ADT)
第3:从单链表的ADT定义来看,只有2个节点的单链表只能存储规模为2的数据;而二叉树ADT的定义,反映
出2个节点时,树型结构可以存储规模为3的数据了
============================================
树的面积的计算:
问题的总规模-------------------树的逻辑 。。。。。。。。。。。//回来写
终于打开了“潘多拉盒子”!!!
浙公网安备 33010602011771号