随笔分类 - 常见数据结构和算法
语言只是工具,算法才是核心。
摘要:算法分析的一般步骤:1、文字描述:如果一个算法文字描述不清楚,就说明思路不清楚,也不可能写好。prim算法是实现图的最小生成树。既然是图,就假设包含n个顶点,m条边。prim算法是从顶点出发的,其算法时间复杂度与顶点数目有关系。(注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。)算法思路:从某个顶点开始,假设v0,此时v0属于最小生成树结点中的一个元素,该集合假设u,剩下的V-v0为待判定的点,此时选取u中的顶点到V-v0中顶点的一个路径最小的边,并且将其中非u中的顶点加入到u中
阅读全文
摘要:算法时间复杂度分析很重要,我们要优化代码,让计算机轻松一点。算法分析,在n个随即数中查找某个数字,最好的情况是第一个数字就是,此时时间复杂度为O(1),若最后一个数字才是我们要找的,那么时间复杂度 是O(n),这是最坏的情况。而平均运行时间是从概率的角度看,若数字在每一个位置都可能出现,则平均查找次数为n/2次。平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。可现实中,平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算而来的。而最坏运行时间是一种保证,那就是运行时间不会再坏了。在应用中,这是最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况下的运行
阅读全文
摘要:用数组模拟栈的实现: 1 #include 2 #include 3 #define STACK_SIZE 100 4 typedef struct Stack 5 { 6 int top; 7 int stack[STACK_SIZE]; 8 }Stack; 9 void In...
阅读全文
摘要:#include #include typedef struct Lnode{ int data; struct Lnode *next;}Lnode;//头插法实现单链表Lnode* createLinkListByHead(int a[],int n){ Lnode* head=(Lnode*)...
阅读全文
摘要:上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是o(1):public class ArrayKMove { /** * 问题:数组的向左k平移,k小于数组长度 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayKMove kmove = new ArrayKMove(); kmove.methodOne(); kmove.methodTwo()...
阅读全文
摘要:堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者。最小堆:根结点的键值是所有堆结点键值中最小者。 1 public class HeapSort { 2 3 ...
阅读全文
摘要:1、冒泡排序: 1 # -*- coding: utf-8 -*- 2 def BubbleSort(a): 3 n=len(a) 4 for i in range(0,n-1): 5 swapped=False 6 for j in range(0,n-i-1): 7 if a[j]>a[j+1]: 8 a[j],a[j+1]=a[j+1],a[j] 9 swapped=True10 if not swapped: break11 ...
阅读全文
摘要:c++ stl sort函数使用举例: 1 #include <iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<functional> 5 6 using namespace std; 7 8 class MyClass 9 {10 public:11 MyClass(int a,int b):first(a),second(b){}12 int first;13 int second;14 bool operator <(const MyClass &m)
阅读全文
摘要:二叉查找数的操作: 1 #include <iostream> 2 3 using namespace std; 4 5 typedef struct BitNode 6 { 7 int data; 8 struct BitNode *lChild,*rChild; 9 }BitNode; 10 11 int main() 12 { 13 void InitTree(BitNode *&BitTree); 14 int PrintTree(BitNode *BitTree); 15 int SearchNode(BitNode *...
阅读全文
摘要:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 /\ 6 10/ \ / \5 7 911因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据..
阅读全文
摘要:实现功能,输入:I am a student 程序处理后输出结果:student a am I程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 5 int main() 6 { 7 void strShift(char *str,char *str1); 8 char str[100]; 9 char str1[100];10 gets(str);11 strShift(str,str1);12 puts(str1);13 return 0;14 ...
阅读全文
摘要:1、冒泡排序:每次把循环过程中最大的数放到最后,循环次数每次减一。 1 void BubbleSort(int a[],int length) 2 { 3 int i,temp,num; 4 for(num=length-1;num>0;num--) 5 { 6 for(i=0;i<num;i++) 7 { 8 if(a[i]>a[i+1]) 9 {10 temp=a[i];11 a[i]=a[i+1];12 ...
阅读全文
摘要:1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 typedef struct Lnode 5 { 6 int data; 7 struct Lnode *next; 8 }Lnode; 9 using namespace std;10 11 int main()12 {13 void Push(Lnode *&lst,int e);14 int Pop(Lnode *&lst,int &x);15 int a[8]={2,9,7,23,8,68,35
阅读全文
摘要:单链表双链表中经常纠结的概念:1、链表是否有含有头结点:(1)带头结点的链表头指针head指向头结点,数据域不含任何信息,只是指向链表的第一个保存信息的结点,head->next等于null则表示链表为空;(2)不带头结点的链表头指针head直接指向保存信息的第一个结点,head==null,表示链表为空。说道这里,有人会对头指针,头结点的概念迷糊了。。。头指针:指向链表的第一个结点,不管是不是带头结点的;头结点:只针对带头结点的链表而言,只作为链表存在的标志,不含信息。一般建立链表最好用带头结点的。 1 #include 2 #include 3 typedef struct Ln..
阅读全文
摘要:题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14/ / / /4 8 12 16转换成双向链表:4=6=8=10=12=14=16 思路:二叉查找树按中序遍历得到的数据是按顺序排列的,所以要按照中序遍历的顺序把二叉树转换成链表;二叉树每一个结点有两个指针left,right,和链表的前驱和后继对应的指针正好对应。 代码: 1 #include <iostream> 2 using namespace std; 3 4 struct BSTreeNode 5 { 6 int m_nValue; /.
阅读全文
摘要:1、 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。2、研究排序算法的稳定性有何意义? 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。再简单具体一点,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai仍然是在 Aj 位置前。下面我们分析一下稳定性的好处:(1)如果排序算法是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所利用。基数排序就是这样,先按低位排序,逐次按高位排序,那...
阅读全文
摘要:1、for(i=0;i<10;++i,sum+=i); 循环结束时 i 和sum的值分别是多少? 分析:循环结束时 i=10应该没有问题,sum计算的位置不是很常见,每次sum+=i 时,i 的值都是先自加1,即 i(从0到9),计算sum时是从1加到10,结果55;如果是:for(i=0;i<10;++i) sum+=i; 循环结束时 i 和sum的值分别是多少? 这次 i 依然是10,但是sum就是0到9的加和,结果45。2、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句。 #define Max(a,b) ((a-b)&(0x80))? b:a #
阅读全文
摘要:函数是所有程序中最重要的单位,无论是面向过程还是面向对象语言。怎样写好函数非常重要。下面是我看书还有结合自己的经验总结的: 首先,函数的书写要遵循一个很重要的原则:短小精悍,即语句要简短,功能要单一,尽量满足一个函数只做一件事情的原则。下面就具体函数的书写过程:(1)确定函数返回类型,voidintbool还是等等?暂时不确定设置为空void;(2)函数名称:函数名称要满足知名知意的原则,还要注意字母的大小写,例如快速排序的函数名一般QuickSort,至少我暂时找不到更适合的了!(3)函数的参数:有些函数没有参数,即为空;但是函数的功能一般是输入数据,返回处理结果,输入的数据即为参数,...
阅读全文

浙公网安备 33010602011771号