导航:首页 > 源码编译 > 编程之美15种算法

编程之美15种算法

发布时间:2025-05-08 10:36:45

编程之美和编程匠艺哪本书比较好

在编程领域,有许多备受推崇的书籍,它们各自有着独特的魅力和价值。《编程珠玑(第二版)》深入浅出地探讨了程序设计中的精髓,不仅涵盖了算法与数据结构的基础知识,还通过具体的例子展示了如何优化代码和提高程序性能。这本书适合有一定编程基础的读者,能够帮助他们提升编程技巧,更好地应对实际工作中的挑战。

另一本同样值得推荐的是《高效程序的奥秘》。这本书从不同角度分析了程序设计中的高效性问题,不仅讲解了如何编写高效的代码,还涉及到了系统层面的优化策略。书中通过大量的实例和实际案例,让读者能够直观地理解高效程序设计的重要性,并学会如何在开发过程中实现高效性。

《编程之美:微软技术面试心得》这本书则侧重于技术面试的技巧与经验分享。它详细记录了微软公司面试过程中的经典问题和解决方案,同时提供了许多实用的建议和策略,帮助读者在技术面试中脱颖而出。这本书不仅适合即将参加技术面试的程序员,也适合那些希望提升自己技术能力的专业人士。

《代码优化:有效使用内存》一书专注于内存管理方面的知识和技巧。通过深入剖析内存分配机制、垃圾回收原理等内容,书中提供了多种优化内存使用的方法和策略。对于那些需要处理大量数据或资源受限环境下的程序设计人员来说,这本书提供了宝贵的指导。

《代码之美》这本书则更多地关注于代码的美学与风格。它探讨了如何编写优雅、可读性强且易于维护的代码,强调了良好的编程习惯和规范的重要性。这本书不仅适合初学者学习,也适合有一定经验的开发者作为提高代码质量的参考。

《编程匠艺(中文版)》则是一本强调实践与经验积累的书籍。它通过大量实例和实战经验,展现了如何在实际项目中运用各种编程技巧和最佳实践。这本书特别适合那些希望在实际工作中提升自己编程能力的专业人士。

Ⅱ 学的c++能看《编程之美》吗

可以的。
《编程之美——微软技术面试心得》收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试,面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。
这本书里面主要涉及到的是各种算法的讨论,以及对程序设计思路的引导。对于任何语言的学习者都是有帮助的。其中大部分算法描述更是采用了C语言作为例子,所以,学习C++看编程之美是没有障碍的。
但是,由于这本书里面涉及到的一些算法比较困难,对于初学者来说会有些偏难,所以最好在C++有一定功底后再去阅读。

Ⅲ 搞编程的我是个算法渣,怎么样能很快的提升算法水平有什么必要的或者非常基础的算法需要掌握

算法的实现需要你对数据结构有充分的理解,我个人觉得数据结构是算法的基础,至少我是先熟悉数据结构再弄算法的,这样接受起来比较快。所以建议你
1:先花些时间掌握数据结构知识,比如数据结构基本类型;线性表、树、图、集合的存储表示以及他们的应用,而要想熟练运用这些线性表、树、图、集合,那么又必须要非常熟练栈和队列,因为栈和队列是必不可少的,如果你非常熟练运用栈和队列,那么你肯定能轻松搞定牵涉到线性表、树等这些应用的。
2:掌握基本的查找算法和排序算法;因为有了上述数据结构的铺垫,也较容易接受查找和排序算法在计算机内部的组织形式,对于运用计算机思想思考问题有很大的帮助。
3:学习常用的算法思想,如分治、贪心、动态规划、回溯等等。学习之后自己动手找一些题目敲敲代码,刚开始可以按照答案敲,慢慢要丢开答案自己来组织思路了。
4:要熟悉分析算法的复杂度,因为接着要开始思考代价问题了,包括时间和空间的开销。
其实用谁的书都无所谓,只要内容齐全了,而你自己阅读起来接受得更好就用谁的。如果还有时间,推荐你看看朱东生赵建利等的《新编数据结构算法 考研指导》(当时我考研用来辅助看的,里面讲解的递归与非递归之间的转换非常好)。
5:如果有兴趣可以看看《编程珠玑》和《编程之美》,有些企业招聘时会从中挑个别题目出题。
总之,我觉得数据结构是基础,算法是灵魂。多思考,多运用就能熟能生巧了。工科类的不多动动手那些知识是很容易生疏的。
以上观点仅供参考,纯属个人观点。

Ⅳ 求高手用c++解决二十四点的问题,具体如下

24点算法分析
很久没有研究程序了,惭愧中。。。这个夏天大致地翻了一下微软亚洲研究院出的《编程之美》,很喜欢这本书的风格,里面很多题目都很有意思。书中主要突出的是一个“巧”字,最关键的,就是从变化中寻找不变的规律。 这次说的问题其实也很简单,给四个数,写一个程序输出算24点的结果,如果没有就输出“No Answer”。但是如果用我们自己算24点的思维来写程序是不行的,因为那属于一种“凑”的方法,有碰巧和经验的成分。计算机能做的,就是通过一种固定的方式来找寻结果。如果没有一般性的所谓“固定”方式,那么只有通过遍历和穷举来解决问题。这样的方法下诞生了很多所谓的NP难问题,如果原始数据规模比较大就要花很长的时间来得到结果。
24点这个问题最直接的方法就是,列举四个数所有的排列组合,加上各种运算符以及括号,所有的情况经过处理之后可以得到一个包含所有计算结果和计算式的列表,从其中寻找24的影踪就可以了。如果不计计算结果重复的情况,最终的结果有7680种,数据量还是有点大,因此这个算法需要进一步的优化。例如,考虑到加法和乘法的交换律,如果遇到相应的情况只计算一种,对于另一种直接返回。这样的剪枝处理可以减少不少的运算。
不过我用的是书中的另一种思路,采用了划分的思想。具体的算法是:
如果A是一个数组,定义f(A)为数组中的所有数经过四则运算所能得到的结果的集合。对于A中元素个数大于1的情况,可以将A分拆成两个集合,定义运算 Fork(A,B)为f(A)和f(B)中各取一个元素的四则运算得到的所有的结果的集合。这样,如果列举出集合A所有的拆分情况,那么所有Fork结果的并集就是f(A)的结果。
对于24点的情况,因为数组A有4个数,因此将其用各种方法拆分即可得到最终的f(A),然后查询其中是否存在元素24即可得到有解或者无解的判断。
需要说明的有几点:
1.这个问题表面上需要采用递归的算法,即如果只有一个元素那么直接返回,否则将问题转化为多个f的计算,而每个f的计算又要经过转化,层层递归,直至只有一个元素的情况。但是,不要忘了递归的方法一般都是针对回溯次数不确定的问题。例如汉诺塔问题,只有一个盘子的情况和64个盘子的情况,回溯次数截然不同,千差万别;但是对于24点,因为只有4个数,实际上分拆的可能性是固定的,就那么有限种情况。递归算法的思路是从树的根部往下遍历,而且一般不知道树的大小和规模。而对于24点问题,这棵树的大小固定,完全可以从树的叶子着手,从叶子向根步进,从而得到最终的结果。
2.分拆有一定的技巧,最合适的方法是通过位运算。比如一种分拆方法是{a1,a2},{a3,a4},那么写做1100和0011。这种方法的好处在于,比如要判断1000是不是1100的一个子集,只需要将两者做与运算,最后的结果如果还等于1100则表明确实是子集,同时分拆的另一个结果便是两者的差。这样至多只需要比较 10多次就可以列举出每个集合所有的分拆情况,比较巧妙的方法。同时,位运算的速度也很快,不会对计算的时间有较大的影响。
3.这个方法的缺点在于,最终得到的只是一个无解或者有解的判断,并没有输出表达式。
所以我对这个算法进行了一定的改进,使之能输出表达式。
首先要考虑的,也是最重要的,是这个程序的数据结构。最终的目的自然是为了达到最少的时间复杂度。由于上述方法中f函数返回的是“集合”,因此不存在重复的元素。这样的情况下,哈希表自然是首选的数据结构。
为了记录表达式,需要引入另一套数据结构。每一个计算的结果都必须和一个表达式对应。这样,当最终查询到一个计算结果为24的时候,只需查找相应的表达式就可以得到结果。
这里就产生了冲突。哈希表的特点是存放是乱序的,也就是说,如果只采用一个哈希表存放计算结果,用一个vector存放表达式,那么无法产生对应关系。
因此,有两种方案:
第一种方案比较节省存储空间,将计算结果和表达式分别存在两个vector中,由于两者都是有序的集合类,因此可以在插入数据的时候令各自的下标对应,这样就可以方便地得到对应关系。但是,这样做的后果是,在插入新数据的时候需要在vector中查找是否已经存在这个计算结果,如果已有则不必插入。 vector的查找是穷举式的,效率比较低,尤其是当vector比较大的时候将很大程度上影响计算的效率。但如果不进行查找,势必会计算很多没有意义的重复结果,这样就失去了这个算法的意义了。
第二种方案在第一种方案的基础上将计算结果多存一份哈希表数据。这样做增加了存储空间,但是在时间上的优势是显而易见的。在插入的时候,通过查找哈希表来决定是否已经存在这个结果,由于哈希表的查找效率很高,因此这一步不会对这个程序造成时间上的瓶颈。如果不存在,那么同时在哈希表和两个vector中同时插入数据即可。计算结果和表达式的对应关系依然存在,同时查找的效率也大大提高,整个程序的时间复杂度大大降低。这是典型的空间换时间的方法。
写算法我首选的语言还是c++,但是很惭愧c++的HashTable我不会用,因此用java写了一个版本,还算比较成功,能输出最终的结果。在写程序前我写了一个小程序来测试java的HashSet和ArrayList的查找效率,结果很令人惊讶。在10000次查询中,HashSet所用时间为0ms,而ArrayList则用了1300多ms,看来这个效率完全不是一个数量级上的。因此我采用了上述的第二种方案,最终的效果还不错。
曾经有人问过我5,5,5,1怎么算24点,当时想了很久都没想出来。现在用这个程序可以很轻松地算出5*(5-1/5)=24。看来这个程序可以输出一些大家想不到的结果,很强大把。类似的例子还有很多,比如3,3,7,7等等。总之呢,优化了的穷举法(我这个程序实际上还是一种变相的穷举)是一种很不错的解决问题的思路,值得采用!
过几天就开学了。也许每年的开学前才有时间去研究下这种问题,等到开学之后就基本没什么时间了。嗯,好好工作把,也愿今年能开个好题,明年好好做毕设。Good luck。

PS:昨天经同学提醒才发现有更好的解决方法。主要是因为好久没用,把java的HashMap给忘了。这个数据结构用在这里正合适,也就是说不用两个HashSet加两个ArrayList解决了,直接存在一个HashMap里面就可以。
具体的做法是:把计算结果存在map的key中,而表达式存在map的value中,问题彻底解决。map中key的查找效率是很高的,同时插入也很快;当找到一个计算结果为24的时候直接根据这个key去寻找相应的value即可得到完美的答案,同时HashMap也保证了每个计算结果只保留一个表达式,避免了重复。
我做了一下性能测试,总的来这个改进后的版本效率比以前的版本略有提高,但是最关键的是大大减少了空间的存储,因此也算是对程序进行的大优化把我想。这两天看这个帖子似乎看的人比较多哈,也愿我的想法能给大家一些启发。

阅读全文

与编程之美15种算法相关的资料

热点内容
cad三维剖切命令 浏览:55
压缩机的气能流多远 浏览:85
linuxfdiskt 浏览:696
iphone没有id怎么用app 浏览:983
手机淘宝网站源码 浏览:743
小车上的压缩机怎么改气泵 浏览:568
免费云服务器任务 浏览:211
苹果怎样在手机上做压缩文件 浏览:644
如何搭建sslvpn服务器 浏览:33
php镜像程序 浏览:7
linux变量命名 浏览:157
phppdf转换为图片 浏览:373
聊天室源码完整版 浏览:588
超值优惠购买得两套源码 浏览:42
日产新阳光压缩机十大品牌 浏览:173
javalong的最大值 浏览:341
mcs51单片机外部引脚ea 浏览:893
苹果手机怎么给app给予信用 浏览:11
java实型 浏览:148
php判断显示 浏览:695