摘要: A*算法的目的是找到一条从起始状态到最终状态的最短路径。在A*算法中,需要在每个点计算启发函数:f(S)=g(S)+h(S),其中g(S)是从起点到S点的距离,h(S)是对从S点到终点的最短距离的估计值。 如果把g(S)当作深度,又令h(S)=0,则A*算法就变成了BFS。A*算法对BFS的改进在于把BFS所用到的队列改成按启发函数值排列的优先队列。假设从状态S抵达终点的最短距离为H(S),那么启发函数中的h(S)必须满足h(S)<=H(S)。在此基础上,h和实际的距离越接近,需要计算的节点就越少,效果就越好。如果h(S)=0,此时A*算法就变成了BFS,效果最差。在解8数字谜题时,如果 阅读全文
posted @ 2013-12-15 11:32 姚来飞 阅读(667) 评论(0) 推荐(0) 编辑
摘要: 一组排列就是一组N个整数的数组,其中0~N-1的每个数都只出现一次。两个排列之间的Kendall tau距离就是在两组排列中相对顺序不同的数对的数目。例如,0 3 1 6 2 5 4和1 0 3 6 4 2 5之间的Kendall tau距离是4,因为0-1、3-1、2-4、5-4这4对数字在两组排列中的相对顺序不同,但其他数字的相对顺序都是相同的。求两个指定数组的Kendall tau距离的代码如下:// 如果数组itemsB是有序数组,那么问题就转化为统计数组itemsA中的逆序对(参见《剑指Offer》面试题36)。而在一般情况下,问题可转化为统计数组itemsA中按照数组items.. 阅读全文
posted @ 2013-12-15 11:18 姚来飞 阅读(1882) 评论(0) 推荐(0) 编辑
摘要: 在对一个链表进行随机化时,可以借鉴自顶向下归并排序的思路,先将链表划分为左右两个子链表,分别进行随机化,然后再归并两个子链表,并在归并过程中进行随机化,代码如下:// *pHead指向链表的首节点(不是头结点)void RandomizeLinkedList(Link * pHead){ int length = CountNodes(* pHead); Randomize(pHead,length); Link tail = * pHead; for(int i = 1;i next; } tail->next = NULL;}// 随机化首节点由*pHead指向,长度为... 阅读全文
posted @ 2013-12-15 11:01 姚来飞 阅读(259) 评论(0) 推荐(0) 编辑