——编码规范
1.不使用难懂的技巧性很高的语句,除非很有必要时
- 高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。这可能是很多初学者最容易犯得错误。
2.去掉没必要的公共变量
- 公共变量是增大模块间耦合的原因之一。全局变量虽然好用,但是宜少不宜多这样能保证数据的安全性。
3.当向公共变量传递数据时,最好做数据合法性检查
- 有必要最好做一下,因为万一出了问题是不好检测出来的。
4.尽量减少没有必要的数据类型默认转换与强制转换
5.对所调用函数的错误返回码要仔细、全面地处理
6.一个函数仅完成一件功能
7.避免设计多参数函数,不使用的参数从接口中去掉
8.检查函数所有参数输入的有效性
- 功能不明确较小的函数,特别是仅有一个上级函数调用它时, 应考虑把它合并到上级
函数中, 而不必单独存在
9.避免使用BOOL参数
- TURE/FALSE 的含义是非常模糊的,这点确实有点惊讶,对于那些内存要求不是很苛刻的能不用就不用吧
11.对于提供了返回值的函数, 在引用时最好使用其返回值
12.在编写代码之前, 应预先设计好程序调试与测试的方法和手段, 并设计好各种调测开关 及相应测试代码如打印函数等
13.在保证软件系统的正确性、 稳定性、可读性及可测性的前提下, 提高代码效率。
14.避免循环体内含判断语句, 应将循环语句置于判断语句的代码块之中
- 笔者确实踩过这样的坑,并且真的很难发现是什么问题。另外循环嵌套尽量不要超过三层且不要太复杂。
15.尽量用乘法或其它方法代替除法,特别是浮点运算中的除法
- 浮点运算除法要占用较多 CPU 资源。应为一般的cpu只有硬件乘法器
16.有可能的话, if语句尽量加上else分支, 对没有else分支的语句要小心对待; switch 语句必须有default分支
17.时刻注意表达式是否会上溢、 下溢
示例:如下程序将造成变量下溢。
unsigned char size ;
while (size-- >= 0) // 将出现下溢
{
... // program code
}
18.打开编译器的所有警告开关对程序进行编译
19.使用代码检查工具(如C语言用PC-Lint)对源程序检查。使用软件工具(如 LogiSCOPE)进行代码审查
- 用过其中一个,效果不理想可能是不会用吧
20.不应通过“试” 来解决问题,应寻找问题的根本原因
- 最精辟的原则之一,可很多人就是通过“试”
21.对自动消失的错误进行分析,搞清楚错误是如何消失的
- 最精辟的原则之一,对于提高能力有很大帮助
——读数学之美启发
概述:
- 《数学之美》是人民邮电出版社于2012年5月(2020年5月发行第三版)出版的图书,作者吴军,书中将高深的数学原理讲得更加简单明了,让非专业读者也能领略数学的魅力。通过具体实例教会读者在解决问题时如何化繁为简,如何用数学去解决工程问题,如何跳出固有思维不断去思考创新等等。
吴博士介绍的内容大多和Google搜索技术有关,可能是因为他曾经工作在Google的原因,大牛就是大牛。
举例——隐马模型:
(朴素贝叶斯)
-
贝叶斯公式
-
朴素?
假设:特征与特征之间相互独立
-
朴素贝叶斯
- 朴素 + 贝叶斯
-
应用场景:
- 文本分类
- 以单词作为特征
-
优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快。
-
缺点:
- 由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好。
举例——信息熵:
(用世界杯的例子来解释信息熵十分清晰,比刻板生硬的直接解释好多了)
- 信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化问题。一条信息的信息量和它的不确定性有直接关系,可以认为信息量就等于不确定性的多少。比如说,对于我们一无所知的事情,需要了解大量的信息。相反,如果对某件事比较了解就不需要太多的信息。那么如何将信息量化呢?
- 书中有一个简单易懂的例子,假设世界杯决赛圈32强已经产生,那么变量“2018年俄罗斯世界杯足球赛32强中,谁是世界杯冠军?”的信息量是多少呢?这时,我问一个知道比赛结果的观众“哪支球队是冠军”?他不愿意直接告诉我,而让我猜,并且我每次猜需要告诉他一元钱才告诉我是否猜对了,那么我需要花多少钱才能知道谁是冠军呢?我可以把球队编上号,从1到32。然后提问:“冠军在1-16号中吗?”假如他告诉我猜对了,我会接着问:“冠军在1-8号中吗?”假如他告诉我猜错了,我自然知道冠军对在9-16号中。这样最多需要五次,我就能知道哪支球队是冠军。所以,谁是世界杯冠军这条消息的信息量只值5元钱。
概念补充(作简单了解):
-
信息——消除随机不定性的东西
-
信息的衡量——信息量——信息熵
-
信息熵(H(X),log的底数b默认为2)
-
H的专业术语称之为信息熵,单位为比特。
性质:信息熵越高,说明事件的不确定性越大。
信息不确定性越大时,该信息的价值越高。
信息熵与概率成反比关系,与信息量成正比关系。
-
小小总结:
- 数学之美,美在它用一个简洁的公式可以很形象地概括一个运动或者一种行为的轨迹,不需要进行随意加入补丁。对我影响比较深刻的,还是书中对于搜索引擎和输入法的例子。
- 搜索引擎算法中的PageRank算法,涉及了大数据应用,信息安全、信息加密等等。
- 输入法中特别是中文输入法的“进化”过程,选择冗余还是充分利用每一个编码值的大小,在商业中的拓展淘汰的过程等等。
- 剩下的就是一些名词,比如隐马模型、信息熵、贝叶斯网络等等,数学之美这本书对于这些名词还是起到很好的解释作用。
算法第一章知识点总结与心得体会
知识点总结:
-
算法与程序
- 算法是指解决问题的一种方法或者一个过程,它是由若干条指令组成的有穷序列
- 算法应当满足下列四条性质
- 输入:有0/1个外部提供的量作为算法的输入
- 输出:算法产生至少1个量作为输出
- 确定性:组成算法的每条指令是清晰的、无歧义的
- 有限性:每条指令的执行次数是有限的
-
算法复杂性分析
-
时间复杂性,顾名思义即需要时间资源的量
-
空间复杂性,顾名思义即需要空间资源的量
-
算法复杂性渐进性态:
-
简单口诀记忆
- 将函数中所有的加法项常数都去掉。
- 在修改后的函数中,只保留最高阶项。
- 如果最高阶项存在,那么去除高阶项前面的系数。
-
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n)
随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低
-
-
-
NP完全性理论
-
NP完全问题(NP-C问题),是世界七大数学难题之一, NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。
-
基本概念
-
P类问题(polynominal) ,存在多项式时间算法的问题,即在多项式时间内可解的问题(例如:冒泡排序、快速排序等问题)。
-
NP类问题(Nondeterministic polynominal) , 能在多项式时间内验证出一个正确解的问题,也就是说这个问题不一定在多项式时间内可解,但可以在多项式时间内验证。
-
NPC类问题(Nondeterminism Polynomial complete),存在这样一个NP问题,所有的NP问题都可以约化成它。
-
NP-Hard类问题(Nondeterminism Polynomial hard),所有的NP问题都可以约化成它。
- 引用框架关系图(可能无法看到,可理解上述描述):
-
-
补充概念:归约
- 归约(Reduction):一个问题A可以用问题B的方法解决。
-
心得体会:
- 第一章的算法知识点算是作简单补充了大一下学期所学的数据结构这门课程(了解了算法应当满足的4条基本性质和复习了时间复杂度、空间复杂度),算法的世界大门刚刚打开便引入世界七大数学难题之一的NP完全问题,当是作一次深奥知识的拓展,期待以后的算法学习之旅能收获更多知识。