- 博客(21)
- 资源 (9)
- 收藏
- 关注
转载 01背包问题
参考自:http://hi.baidu.com/acmgood/blog/item/53ca7237aaab32d5a3cc2bb4.html 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品放入一
2015-07-30 16:04:53 667
原创 二叉树的非递归遍历
#include <iostream>#include <stack>using namespace std;typedef struct node{ int data ; //节点信息 struct node * leftChild ; //左孩子 struct node * rightChild ; //右孩子}BiTreeNo
2015-07-30 15:16:19 453
原创 Trie树、字典树
列表内容 我们来看看Trie树的特点:根节点为空值,剩下每一个节点保存一个字母。 如果从根节点遍历到某一个节点把路径节点的值连在一起就构成了一个字符串,利用这个特点很容易想到这棵树的第一个功能能帮我们查找某一个单词是否在树中(需要在每一个节点设置一个标志,表示从根节点到此节点是否存在一个单词);如果该单词存在,我们可以利用它实现第二个功能:去除重复单词;同样如果该词存,在我们还可以看
2015-07-30 11:57:29 402
原创 算法复习之基数排序
LSD:从低位排序逐步至高位排序,此处的低位指的是从个位->十位->百位…. 代码如下://获取数据d位的值int getDigit(int x,int d){ int value = 1 ; for(int i = 0 ;i <d-1;++i) value *= 10 ; return (x/value)%10;}//LSD 算法void lsd
2015-07-20 09:39:15 466
转载 使用两个栈实现堆
扩展:用两个队列实现一个栈?思路: 1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。 2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。 3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中, 4.此时若要做po
2015-07-10 17:56:02 1352
转载 判断链表中是否有环存在
思路: 用两个指针,pSlow,pFast,就是一个慢一个快 慢的一次跳一步, 快的一次跳两步, 什么时候快的追上慢的了就表示有环(pSlow == pFast )。 实现如下:struct listtype{ int data; struct listtype * next;}list;int find_cicle(list *head){ list *
2015-07-10 17:34:45 458
转载 逆序输出问题
一,题目 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};二,分析解法一:把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。参考 解法二:从头到尾遍历链表,每经过一个结点的时候,把该结点放到一个栈
2015-07-10 17:09:52 604
转载 删除单链表节点O(1)
一,题目给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 二,分析 这是一道广为流传的Google面
2015-07-10 16:27:39 2838
原创 算法复习之两路归并排序
两路归并排序最差时间复杂度:O(nlogn) 平均时间复杂度:O(nlogn) 最差空间复杂度:O(n) 稳定性:稳定两路归并排序(Merge Sort),也就是我们常说的归并排序,也叫合并排序。它是建立在归并操作上的一种有效的排序算法,归并操作即将两个已经排序的序列合并成一个序列的操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并操作的基本步骤如下
2015-07-09 16:32:02 1913
原创 算法复习之堆排序
/**将两个元素进行交换*params *p ,*q待交换的两个元素的指针*/void swap(int *p,int *q){ int temp ; temp = *p ; *p = *q ; *q = temp ;}/**堆向下调整*list:堆的数组,hole:待调整的数据,len:待调整的堆的大小*/void HeapAdjust(int
2015-07-09 14:44:11 345
原创 算法复习之二分查找
#include<iostream>/**有序数组的二分法查询*list:有序的数组,len:数组的长度,key:查询的关键值*@return* -1:表示查询失败,其他数字:表示查询成功*/int binarySearch(int* list,int len ,int key){ int low = 0,high =len-1;//数组的两个“游标” int mid
2015-07-09 11:00:21 363
原创 算法复习之希尔排序
#include<iostream>void prin(int* list,int len){ for(int i = 0 ;i<len ;++len) std::cout<<list[i]<<" " <<std::endl;}/**希尔排序*list:待排序的数组,len:待排序数组的长度*时间复杂度:O(nlgn)* 希尔排序是按照不同步长对元素进行插
2015-07-09 10:18:51 365
原创 算法复习之插入排序
#include<iostream>void prin(int *list,int len){ for(int i= 0;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/************************************************************************//*
2015-07-08 22:55:52 374
原创 算法复习之选择排序
#include <iostream>//打印输出void prin(int *list ,int len ){ for(int i = 0 ;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/**选择排序*list : 待排序的数组,len:待排序数组的长度*时间复杂度:n^2,空间复杂度 O(1)*/voi
2015-07-08 21:52:21 312
原创 算法复习之快速排序
#include<iostream>int partition_1(int *list,int low,int high) { int privot = list[low] ;//分割点 while(low < high) { while( low < high && list[high] >= privot)//从high处寻找小于privot的值
2015-07-08 21:29:56 343
原创 算法复习之冒泡排序
#include <iostream>//打印输出void prin(int *list ,int len ){ for(int i = 0 ;i<len;++i) std::cout<<list[i]<<" "<<std::endl;}/**冒泡排序*list 数组,len数组的长度*/void bubbleSort(int *list,int len)
2015-07-08 21:07:05 401
原创 堆栈的理论知识
堆和栈的理论知识 1.申请方式栈:由系统自动分配和回收。 例如,声明在函数中的一个局部变量int b,系统自动在栈中为b开辟空间。堆:需要程序员自己申请,并指明大小,在C语言中用malloc等函数申请。 例如:p1 = (char*)malloc(10*sizeof(char)) ; 在C++中使用new运算符进行,但是注意p1,p2本身是在栈中的。
2015-07-08 14:16:25 522
原创 树的前序,中序,后序推理问题
某二叉树中序序列为ABCDEFG,后序序列为BDCAFGE,则前序序列是?1.由后序可知,E是整个二叉树的根。然后在中序里划分: ~~~~~~~E ~~~~~~/~\ ~ (BDCA) (FG) 2.由后序可知,A是左子树的根,然后在中序里ABCD判断A没有左子树: ~~~~~~E ~~~~~/~\ ~~~~A (FG) ~~~~~\ ~~~~(BD
2015-07-08 12:02:26 619
转载 Nagel算法
Nagel算法TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。Nagle算法的基本定义是任意时刻,最多只
2015-07-04 11:20:48 498
原创 TCP/IP三次握手和四次挥手
1、建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。2、连接终止协议(四次挥手)
2015-07-03 16:05:45 374
转载 私有继承
私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承的含义:私有继承意味着 “用…来实现”。 如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。
2015-07-02 21:04:25 448
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人