代码改变世界

随笔分类 -  编程之美

经典算法总结之线性时间做选择

2012-08-17 10:15 by javaspring, 10352 阅读, 收藏,
摘要: 问题:输入:一个包含n个(不同的)数的集合A和一个数i, 1 <= I <= n。输出:元素x∈A, 它恰大于A中其他的I – 1个元素(即求第k小数)。本博文中寻找最大的K个数(TOP K算法)这篇文章也用了本文中的算法,大家可以参考。三种算法:1、 直接排序,输出数组第i个元素即可, 时间复杂度为O(nlgn)2、 这种算法,利用“快排的或者类似二分”的思想,每次以枢纽为界,分两边,每次只需处理一边即可(抛弃另一边),平均情况下的运行时间界为O(n),这种算法以期望时间做选择。《算法都论》里是,在分治时用随机数来选取枢纽(算法导论中伪代码见图),好吧,这是理论上的算法,它没有考 阅读全文

经典算法大总结之排序算法

2012-08-15 16:17 by javaspring, 322 阅读, 收藏,
摘要: 从本章开始,我们将总结常用的排序算法一,插入排序,O(n2)#include<iostream> using namespace std; void insertionSort(int* A,int len){ for(int j=1;j<len;j++){ int key = A[j]; int i = j-1; while(i>=0&&A[i]>key){ A[i+1] = A[i]; i = i-1; } A[i+1] = key; } }; void main(){ int A[6] = {5,2,4,6,1,3}; insertionSo 阅读全文

常用C字符串库函数总结

2012-08-15 11:12 by javaspring, 322 阅读, 收藏,
摘要: 考察编写同库函数一样功能的函数经常见于大大小小的IT公司的面试题目中,以下是常见的字符串库函数的实现,希望大家指正建议。1,反转函数reverse();#include<stdio.h> #include<string.h> char* reverse(char* Array){ if(!Array) return NULL; int len = strlen(Array); for(int i=0;i<len/2;i++){ char temp = *(Array+i); *(Array+i) = *(Array+len-1-i); *(Array+len-1- 阅读全文

数据结构大总结系列之B树和R树

2012-08-14 21:17 by javaspring, 6907 阅读, 收藏,
摘要: 数据结构大总结系列之B树一,B-树B树是为磁盘或其他直接存储辅助存储设备而设计的一种平衡二叉查找树(通常说的B树是B-树,在1972年由R.Bayer和E.M.McCreight提出,B+树是B树的一种变形),B树与红黑树类似,但在降低磁盘I/O操作次数方面要更好一些,数据库就是通常用B树来进行存储信息。 B树的结点可以有许多子女,从几个到几千个不等,一个B树结点可以拥有的子女数是由磁盘页的大小所决定,这是因为一个结点的大小通常相当于一个完整的磁盘页。磁盘存取次数是按需要从盘中读出或向盘中写入的信息的页数来度量的,所以,存取磁盘的总时间可以近似为读或写的页数。因此,B树一般都选择大的分支因子, 阅读全文

数据结构大总结系列之红黑树

2012-08-14 20:03 by javaspring, 395 阅读, 收藏,
摘要: 一,红黑树的性质:红黑树本质是二叉查找树的一种,它的性能高于普通的二叉查找树,即使是在最坏的情况下也能保证时间复杂度为O(lgn)。红黑树在每个结点上增加一个存储位表示结点的颜色(或红或黑)。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树可以保证没有一条路径会比其他路径长出两倍,因而是接近平衡的。 红黑树的每个结点至少包含五个域:color,key,left,right 和 parent,如果某结点没有子结点或者父结点,则该结点相应的指针(p)域包含值NIL,我们将这些 NIL 当作叶子结点.(图a)。 在实际处理过程中,往往将最底层的孩子结点和根结点的父亲都指向同一个 NIL 阅读全文