文章分类 -  算法研究

摘要:在《单链表操作——交换节点》的代码中,有一个Bug,就是当交换的是链表中相邻的两个节点的时候,程序会Down,原因是在交换节点操作中指针的修改引起的(只需要手工运行下程序就十分清楚了)。因此需要作一点修补,就是判断两个节点是否是相邻节点,再单独处理即可。 阅读全文

posted @ 2005-08-11 22:00 k_eckel's mindview 阅读(1027) 评论(1) 推荐(0)

摘要:单链表的交换节点的含义是:给定一个单链表,要求交换其中的任意两个节点。注意这里链表的头节点是不参与节点交换的。这个看上去是比较简单,但是实现起来却还是需要一定的基本功。 阅读全文

posted @ 2005-08-11 21:58 k_eckel's mindview 阅读(3919) 评论(1) 推荐(0)

摘要:子串匹配当然也可以使用不回溯的方式实现,这个算法是笔者在作一个模糊查询的实现的时候想到的,没有确认和通常算法的异同,可能是一个很平常的思想:)。实现的思想很简单:每次比较子串长度的大字符串,若相等则返回,否则在大字符串中的起始位置递进,直到大字符串结束。 阅读全文

posted @ 2005-08-11 11:03 k_eckel's mindview 阅读(1078) 评论(0) 推荐(0)

摘要:回溯法求解子串的过程为:依次遍历大字符串和子串,当发现不相等的时候就回溯到上次起始字符的下一个字符继续,并给子串起始位置清零。当遍历完整个大字符串(没有找到)或者遍历完子串(找到)则算法退出。 阅读全文

posted @ 2005-08-11 09:37 k_eckel's mindview 阅读(1618) 评论(0) 推荐(0)

摘要:网上看到一个面试题(据说是ATC的):写一个在一百万数字中求最大的10个数字的算法。这个问题的解决方案很多,显然考察的是算法的效率(因为基数一百万)。至少有以下几种解法:1)冒泡10次;2)用一个10个大小的数组保存最初10个元素,然后遍历,遇到比最小的大的元素就插入这个数组中,并去掉最小的元素。显然这两种解法的效率都不是特别合适。基于堆的算法应该是提供了一个较好的解决方案,构建大顶堆,取得第一个元素,然后循环10次即可达到题目要求。当然,直接使用基于堆的优先队列可以达到同样的目的。 阅读全文

posted @ 2005-08-10 20:25 k_eckel's mindview 阅读(3516) 评论(0) 推荐(0)

摘要:k_eckel:http://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com 二分查找是提升系统的有效技术之一,特别是处理大规模的数据检索或者查询的时候,二分查找就更加表现出非凡的算法效率。并且二分查找的思想更加是值得我们好好体会和融会贯通的: //查找 二分查找 template int BinSearch(... 阅读全文

posted @ 2005-08-08 15:50 k_eckel's mindview 阅读(842) 评论(2) 推荐(0)

摘要:实际上你可以在VC IDE中设置命令行参数,方法为:Project->Settings->Debug->General:Program Arguments中输入参数即可。 阅读全文

posted @ 2005-08-07 10:12 k_eckel's mindview 阅读(568) 评论(0) 推荐(0)

摘要:k_eckel:http://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com 二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。二叉树后序遍历的非递归遍历中当当前节点存在右子树的时候需要先遍历右子树,因此要对二叉树的节点定义中添加_tag域,标志当前节点右子树是否已经遍历,备用的结构定... 阅读全文

posted @ 2005-08-05 00:24 k_eckel's mindview 阅读(6893) 评论(0) 推荐(0)

摘要:k_eckel:http://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com 二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。几个备用的结构定义和函数: //二叉树节点定义 class TreeNodeElement { public: ... 阅读全文

posted @ 2005-08-04 22:58 k_eckel's mindview 阅读(5254) 评论(0) 推荐(0)

摘要:算法基于这样一种思想:将待移动的字符串从移动点分为a、b两个子串,逆转a,再逆转b,再逆转得到的整个字符串。即:(a’b’)’ = ba。 阅读全文

posted @ 2005-08-04 13:30 k_eckel's mindview 阅读(842) 评论(3) 推荐(0)

摘要:二叉树前序遍历的递归和非递归实现 阅读全文

posted @ 2005-07-30 16:31 k_eckel's mindview 阅读(3281) 评论(1) 推荐(0)

摘要:这也是网络流传的Microsoft的面试题目之一:“怎样从顶部开始逐层打印二叉树结点数据?请编程”。这个题目实际上很简单,采用队列的方式很容易可以实现: 阅读全文

posted @ 2005-07-22 13:28 k_eckel's mindview 阅读(6673) 评论(10) 推荐(0)

摘要:给定一个字符串,要求给出其所有的排列。例如给出“ABC”,则其排列有:ABC,ACB,BAC,BCA,CAB,CBA 6种。这是一个看似简单,但是实现起来却不是很容易的问题。记得去年一个师姐去参加某NB公司的笔试的时候就被这样一个问题给整了,更加郁闷的是别人是把程序都给出了,给出了输入,要给出输出。结果是倒弄了半天,最后发现是求解全排列,郁闷不已! 阅读全文

posted @ 2005-07-21 11:00 k_eckel's mindview 阅读(1597) 评论(5) 推荐(0)

摘要:没有人会怀疑实现交换两个整数(或者字符等)的程序是很简单的,但是很多人也会被这样的一个问题郁闷:不用任何中间变量,实现两个整数的交换。在《微软面试题——反转字符串》中列出了比较常见的做法,但是这种Hack技巧却带来了后遗症。 阅读全文

posted @ 2005-07-21 10:36 k_eckel's mindview 阅读(651) 评论(6) 推荐(0)

摘要:前几天和一位老师聊天,老师是一位很实干的老师,刚从英国回来。说到去给一个公司招聘面试时候,对着10几个计算机专业的研究生让写一个求最大公约数的欧几里德算法,连思想都给出了,竟然…..。我无语,想想自己在很多时候也对基础的简单的经典的算法有些忽略了,心有余悸。 欧几里德算法也就是辗转相除法,有着2000年的历史了。欧几里德算法依据的算法理论是一个定理:gcd(a,b) = gcd(b,a mod b)。 阅读全文

posted @ 2005-07-20 10:01 k_eckel's mindview 阅读(9007) 评论(5) 推荐(1)

摘要:网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。 阅读全文

posted @ 2005-07-19 15:53 k_eckel's mindview 阅读(13283) 评论(0) 推荐(1)

摘要:单链表的逆转过程的关键是3个指针:一个记录当前逆转节点的前一个节点,一个记录当前逆转节点的下一个节点,另外一个则记录当前的逆转节点。 阅读全文

posted @ 2005-07-19 09:49 k_eckel's mindview 阅读(2739) 评论(1) 推荐(0)

摘要:快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最右端的元素。 Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。 阅读全文

posted @ 2005-07-17 11:09 k_eckel's mindview 阅读(559) 评论(2) 推荐(0)

摘要:堆排序的过程就是不断建堆的过程:1)初始化得到初始堆;2)将堆顶元素和堆中最后元素交换,在构建堆。注意到这个交换过程除堆顶元素破坏堆,并不会影响堆(原因:堆顶元素或是最大,或是最小)。 因此堆排序有关键是两个建堆函数:自底向上堆化和自顶向下堆化,分别对应代码中FixUp()和FixDown()。需要注意的是:为了方便堆的操作,我们一般将N+1个元素的数组的第一个元素不用,使用1到N的元素... 阅读全文

posted @ 2005-07-17 10:57 k_eckel's mindview 阅读(913) 评论(0) 推荐(0)

摘要:冒泡排序和选择排序是排序算法中比较简单和容易实现的算法。冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。而选择排序的思想也很直观:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。两者的实现源码为: 阅读全文

posted @ 2005-07-17 10:50 k_eckel's mindview 阅读(1333) 评论(1) 推荐(0)