2011年9月23日
摘要: 蛋疼中..于是草草看了一下书 开始琢磨一些无聊的玩意。首先是快排。我以前没怎么认真学过数据结构,这两天才稍微好好看了看。不禁感叹快排究竟是何方神圣怎么想出来的。快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。它的平均性能很不错,是O(nlgn)。实际上,它的运行效果甚至要好于归并排序。实际编程中可以通过c++的标准库直接利用快速排序。实例如下:#include <iostream>#include <cs 阅读全文
posted @ 2011-09-23 21:16 bovine 阅读(208) 评论(0) 推荐(0) 编辑
  2011年9月22日
摘要: 可以说堆排序兼具了插入排序和归并排序的优点。想插入排序一样,它sorts in place;同时时间复杂度达到归并排序的级别O(nlgn)。以大根堆为例,大根堆中,除了根以外的每个结点i,都有: A[parent(i)]>=A[i]。大根堆的基本过程包括:max_heapify(a,i).对结点i及其子孙结点保持大根堆的性质;build_max_heap.对给定的数组建堆。思路是从最后一个非叶子结点开始max_heapify;heapsort.进行大根堆排序.从最后一个元素开始,交换根结点和其位置,然后max_heapify后重复此过程。//realization of heatsort 阅读全文
posted @ 2011-09-22 21:07 bovine 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 关于补码,微机原理这门课里面详细地叙述过,今天来是因为这个自己有些遗忘的细节。对于n位二进制表示的码字,补码的公式定义是:2^n+这个数 然后用二进制表示。比如:考虑n=8,对于正数15,补码应该是:2^8+15=00001111对于负数-15,补码应该是:2^8-15=11110001对于负数-128,补码应该是:2^8+(-2^7)=10000000 这个情况根据原码反码补码的公式是无法推导出来的这个例子告诉我,有时候口诀固然方便,但是回归本源往往是更加有效的方法。 阅读全文
posted @ 2011-09-22 19:54 bovine 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 算法导论上2-4是这样一个题目:设A[1...n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i, j)就称为A中的一个逆序对(inversion)。试给出一个算法,它能用O(nlgn)的最坏情况运行时间确定n个元素的任何排列中逆序对的数目。咋一看没有什么思路,可一看见提示赫然给出:修改归并排序,于是顿悟。其实,只需要在归并排序中加上一个计数器,在每次merge的时候计算逆序对,这样就可以算出总共的逆序对了。#include <iostream>using namespace std;void merge_sort(int *A,int 阅读全文
posted @ 2011-09-22 13:28 bovine 阅读(1789) 评论(0) 推荐(0) 编辑
  2011年9月21日
摘要: 算法导论习题5.2.4介绍了一个帽子保管问题(hat-check problem):有n位顾客,他们每个人给餐厅负责保管帽子的服务生一顶帽子。服务生以随机的顺序将帽子归还给顾客。请问拿到自己帽子的顾客的期望数目是多少?解法一:利用算法导论一书中介绍的indicator random variables,假设随机变量Xi满足(1<=i<=n):那么总的随机变量x满足:对于每一个顾客,他拿到自己帽子的概率是1/n,所以:所以,这个思路根据算法导论书上的讲解比较容易想到,但是真正想的时候我不免回到了忘日学习概率论的惯性思维中,于是有了解法二,比解法一复杂不少。解法二:基本思想是利用 期望 阅读全文
posted @ 2011-09-21 20:40 bovine 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 一直以来,放浪形骸,悔当初不该;浪子回头,有时候,要给自己一个理由。Do I have reasons? Yes!Many reasons? Yes!How many reasons do I need? No!I just wanna have fun! andThat's it!!in quest of excellence; Anything but mediocre! 阅读全文
posted @ 2011-09-21 16:22 bovine 阅读(181) 评论(0) 推荐(0) 编辑