Pegasus' Blog
保持一颗好奇心

markdown简明语法

  1. 标题设置(让字体变大,和word的标题意思一样)
    在Markdown当中设置标题,有两种方式:
    第一种:通过在文字下方添加“=”和“-”,他们分别表示一级标题和二级标题。
    第二种:在文字开头加上 “#”,通过“#”数量表示几级标题。(一共只有1~6级标题,1级标题字体最大)

vim正则表达式

Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。

如果你比较熟悉Perl的正规表达式,可以直接参照与Perl正则表达式的区别一节。


vim表示中表示当前目录和文件名的方法

vim
1
2
3
4
5
6
在命令行模式下:
% 当前完整的文件名
%:h 文件名的头部,即文件目录.例如../path/test.c就会为../path
%:t 文件名的尾部.例如../path/test.c就会为test.c
%:r 无扩展名的文件名.例如../path/test就会成为test
%:e 扩展名

经典排序算法的c++实现

####堆排序-heapsort
利用最大堆实现。
最大堆:最大堆性质是除了根结点意外的所有结点 i 都要满足A[parent[i]] >= A[i]
需要利用到的一个性质:当用数组表示存储n个元素的堆时,叶结点的下标分别是n/2, n/2+1, n/2 + 2, ……,n - 1. (下标从0开始)
需要用到的函数有:
void max_heapify(int a, int i) //通过让a[i]的值在最大堆中“逐级下降”,从而使得以下标i为根结点的字数重新遵循最大堆的性质。O(lgn)
void build_max_heap(int
a) //对树中非叶结点都调用一次max_heapify(a, i)。 O(n)
void heapsort(int *a, int n) //对长度为n的数组a调用堆排序。 O(nlgn)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//heapsort.cpp
inline void swap(int &a, int &b) { int t = a; a = b; b = t; }
inline int parent(int i) { return (i-1) >> 1; } //下标都是从0开始,与算导上不一样
inline int left(int i) { return (i << 1) + 1; }
inline int right(int i) { return (i << 1) + 2; }

int heap_size, heap_length; //heap_length是数组元素个数,heap_size是有多少个元素存储在数组中。0<=heap_size<=heap_length

void max_heapify(int *a, int i)
{ //O(lgn), 维护heap的性质,使得以下标i为根结点的子树重新遵循最大堆的性质
int l = left(i), r = right(i);
int largest = 0;
if (l < heap_size && a[l] > a[i])
largest = l;
else
largest = i;
if (r < heap_size && a[r] > a[largest])
largest = r;
if (largest != i) {
swap(a[i], a[largest]);
max_heapify(a, largest);
}
}

void build_max_heap(int *a) { //O(n), 对树中非叶结点都调用一次 max_heapify
heap_size = heap_length;
for (int i = heap_length/2 - 1; i >= 0; --i) //可以证明下标为n/2-1到0的结点为非叶结点
max_heapify(a, i); //i逆序递减的原因:任何时候对结点i调用max_heapify,该i的两个子树都是最大堆
}

void heapsort(int *a, int n) { //O(nlgn),调用heapsort(a, n)对数组a排序
heap_length = n;
build_max_heap(a);
for (int i = heap_length - 1; i >= 1; --i) {
swap(a[0], a[i]);
--heap_size;
max_heapify(a, 0);
}
}

如何处理你的负面情绪

Tal主讲的哈佛公开课幸福课(positive psychology)看完了,学到了一些内容,抛开制度、社会等因素,仅从个人角度谈谈如何处理负面情绪。(科学严谨性有待证明)等你心情不好了可以看看。


不快乐的大多数?

我不太清楚大多数人是否快乐,但是大三之前的我肯定是不快乐的。即使到现在,我也不能说自己是个快乐的人,但是处理情绪的能力确实有所提升。每个人都有一个快乐基础水平,按照Tal的说法叫做”Happiness base level”,每天你会遇到各种各样快乐或者烦恼的事,所以你的情绪水平每天是在这个base level上下波动的,所以不能用一时的情绪水平衡量一个人是否快乐,需要用base level来衡量。当一个人独处时,有的人内心平和,心态良好,有的人却感觉内心失落,产生强烈的孤独感,前者的base level肯定是要高于后者的,而且对于基准较高的人即使遇到了烦心事也很快会恢复到较高的快乐水平。比较倒霉的是,我发现我这人的base level处于一个很低的水平,而且人的base level 50%和基因有关,也就是说有些不幸的人生来就注定快乐水平低,加上来自社会的各种压力,很多人就会感到不快乐。Tal说,北美很多学校感到抑郁的学生人数比例在40%多,提升人的快乐水平,推广积极心理学成为一件很重要的事。抛去环境因素和基因的影响,我们还是有一定的自主权去改善自己的情绪水平。幸福是人生的终极目标,幸福应是快乐和意义的结合。

为什么binary search用beg+(end-beg)/2计算mid?

####binary search中计算mid=(beg+end)/2与mid=beg+(end-beg)/2的区别?
这两种写法应该都见过,突然想起了这个问题,自己没想出来什么结果,感觉没有不同。后来再各种论坛问了问,结果都没能说出什么道理,还是stackoverflow比较牛,刚post上去没两分钟就给出来了答案。以后多逛逛stackoverflow吧。
http://stackoverflow.com/questions/20998982/whats-the-difference-between-mid-begend-2-and-mid-begend-beg-2-in-binary

图的深搜(dfs)广搜(bfs)c++实现

以下是基于图的链表表示的:
dfs和bfs的演示:(具体见《算法导论》)
[深搜](http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html)
[广搜](http://sjjg.js.zwu.edu.cn/SFXX/sf1/sdyxbl.html)
bfs通过检测边发现点,被发现点(但未探索)入队。(被探索是指是否检测过与该点相关联的临近顶点)一个顶点被完全探索当且仅当他的所有边被检测。一个顶点探索完选另一个顶点,被选点应位于被发现但未被探索点队列的队首。待探索点集为空时算法结束。(bfs探索顺序与发现顺序一致,dfs发现后马上探索)

c/c++测试程序运行时间

c++
c++, c

算法分析中需要对各种算法进行性能测试,下面介绍两种通用的测试方法,由于只用到标准c语言函数,所以在各种平台和编译器下都能使用。

开篇-写给自己

回顾一下这三年


  一直都想写点什么,但又不知道写什么。
  大学三年过得很快,马上就要毕业了。最近一直在想,大学这三年,究竟获得了什么?回想一下这三年,总感觉一片空白。每天差不多都是三点一线的生活,三年来没有参加过什么活动,没有游历过什么地方,也没有交过太多朋友。很多时候就是在教室自习,看书看烦了晚上就去操场跑跑步。或许生活就该这么平淡吧。

函数指针VS函数对象

c++
c++

函数指针:指向函数的指针变量。本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。