大话数据结构文摘

第1章 数据结构绪论

程序设计=数据结构+算法

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合

1.逻辑结构 :是指数据对象中数据元素之间的相互关系

a:集合结构  b:线性结构  c:树形结构  d:图形结构

2.物理结构:在计算机中的存储形式

a: 循序存储  b: 链式存储

第2章 算法

算法: 是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作

特性:1.输入输出 2.有穷性 3.确定性 4.可行性

算法设计的要求:

1.正确性 2.可读性 3.健壮性 4.时间效率高和存储量低

算法的时间复杂度:

推导大O阶方法:

1. 用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高阶项

3.如果最高价项存在且不是1,则去除与这个项相乘的常数

常数阶:O(1)  ;   线性阶:   O(n) ;  对数阶:O(logn) ;  平方阶: O(n2)

O(1)  <   O(logn)  <  O(n)   <   O(nlogn)  < O(n2)   <  O(n3)   <   O(2n)  < O(n!)  <  O(nn)

第3章 线性表

线性表:零个或多个数据元素的有限序列

1.顺序存储结构:

优点缺点
无须为表示表中元素之间的逻辑关系而增加额外的存储空间插入和删除操作需要移动大量元素
可以快速地存取表中任一位置的元素当线性表长度变化较大时难以确定存储空间的容量
 造成存储空间的“碎片”

 

2.链式存储结构:

单链表:

单链表与顺序存储结构作比较:

存储分配方式时间性能空间性能
顺序存储用一段连续的存储单元依次存储线性表的数据元素查找:顺序:O(1),单链:O(n)
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素插入删除:顺序:O(n),单链:O(1)

 

静态链表:用数组描述的链表

优点缺点
在插入和删除操作时,只需要修改游标,不需要移动元素没有解决连续存储分配带来的表长难以确定的问题
 失去了顺序存储结构随机存取的特性

 

循环链表:将单链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表

双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域

第4章 栈与队列

栈:限定仅在表尾进行插入和删除操作的线性表

后进先出,(3种元素,就有5种可能的出栈顺序)

栈的顺序存储结构,进栈,出栈,O(1)

两栈共享空间

栈的链式存储结构,0(1)

斐波那契数列:

0 ,当n=0

1,当n=1

F(n) = F(n-1) + F(n-2),当n>1

四则运算表达式求值:后缀表达法,(逆波兰)

-----------------------------------------------------------------

队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表

先进先出

第5章 串

由零个或多个字符组成的有限序列,字符串

朴素的模糊匹配算法:最好:O(n+m),n为主串长度,m为子串长度,最差:O((n-m+1)*m)

KMP模式匹配算法:O(n+m)

第6章 树

完全二叉树

二叉树遍历方法:1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历 

线索二叉树

赫夫曼树

第7章 图 

第8章 查找

1.静态查找:

顺序查找:O(n)

/* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */
int Sequential_Search(int *a,int n,int key)
{int i;for(i=1;i<=n;i++){if (a[i]==key)return i;}return 0;
}
/* 有哨兵顺序查找 */
int Sequential_Search2(int *a,int n,int key)
{int i;a[0]=key;i=n;while(a[i]!=key){i--;}return i;
}

有序表查找:

二分查找:O(logn)/* 折半查找 */

递归算法

  static int BinarySearch2(int[] a, int value, int low, int high){int mid = (low + high) / 2;if (a[mid] == value)return mid;else if (a[mid] > value)return BinarySearch2(a, value, low, mid);else if (a[mid] < value)return BinarySearch2(a, value, mid, high);else return 0;}

非递归算法

int Binary_Search(int *a,int n,int key)
{int low,high,mid;low=1;    /* 定义最低下标为记录首位 */high=n;    /* 定义最高下标为记录末位 */while(low<=high){mid=(low+high)/2;    /* 折半 */if (key<a[mid])        /* 若查找值比中值小 */high=mid-1;        /* 最高下标调整到中位下标小一位 */else if (key>a[mid])/* 若查找值比中值大 */low=mid+1;        /* 最低下标调整到中位下标大一位 */else{return mid;        /* 若相等则说明mid即为查找到的位置 */}}return 0;
}


c#版本:

static int Test(int[] a,int x)
{
int low = 0, high = a.Length-1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (x < a[mid])
{
high = mid - 1;
}
else if (x > a[mid])
{
low = mid + 1;
}
else
{
return mid;
}
}
return 0;
}

 

插值查找:O(logn)

/* 插值查找 */
int Interpolation_Search(int *a,int n,int key)
{int low,high,mid;low=1;    /* 定义最低下标为记录首位 */high=n;    /* 定义最高下标为记录末位 */while(low<=high){mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */if (key<a[mid])        /* 若查找值比插值小 */high=mid-1;        /* 最高下标调整到插值下标小一位 */else if (key>a[mid])/* 若查找值比插值大 */low=mid+1;        /* 最低下标调整到插值下标大一位 */elsereturn mid;        /* 若相等则说明mid即为查找到的位置 */}return 0;
}

斐波那契查找

线性索引查找:

稠密索引,在线性索引中,将数据项的每个记录对应一个索引项。

分块索引,分块有序的数据集,将每块对应一个索引项。

倒排索引,由属性值来确定记录的位置。

2.动态查找:查找时需要插入和删除

二叉排序树,O(logn)-O(n)

平衡二叉树(AVL树),(O(logn))

B树(多路查找树)

2-3树

2-3-4树

B+树

散列表查找

直接定址法,数学分析法,平方取中法,折叠法,除留余数法,随机数法

处理散列冲突的方法:1.开放定址法,2再散列函数法,3.链地址法,4,公共溢出区法

第9章 排序

排序
插入排序类选择排序类交换排序类归并排序类
直接插入排序希尔排序简单选择排序堆排序冒泡排序快速排序归并排序

排序方法平均情况最好情况最坏情况辅助空间稳定性
 冒泡排序 O(n2) O(n) O(n2) O(1)稳定
 简单选择排序 O(n2) O(n2) O(n2) O(1)稳定 
 直接插入排序 O(n2) O(n) O(n2) O(1)稳定 
 希尔排序 O(nlogn)-O(n2) O(n1.3) O(n2) O(1)不稳定 
 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1)不稳定 
 归并排序 O(nlogn) O(nlogn) O(nlogn) O(n)稳定 
 快速排序 O(nlogn) O(nlogn) O(n2) O(nlogn)-O(n2)不稳定 

 

假设含有n个记录的序列为{r1,r2,.....rn},其对应的关键字分别为{k1,k2...kn},

需确定1,2,。。。N的一种排列p1,p2,...pn,使其相应的关键字满足kp1<=kp2...<=kpn

非递减(或非递增)关系,即使得序列成为一个按关键字有序的序列{rp1,rp2...rpn},这样的操作叫做排序

排序的稳定性

假设ki=kj,且在排序前的序列中ri领先于rj,如果排序后仍然领先,则是稳定的,反之是不稳定的。

内排序与外排序

内排序所有记录放在内存中,外排序需要在内外存之间多次交换数据才能进行。

冒泡排序:

        int[] array = { };void swap(int[] array, int i, int j){int temp = array[i];array[i] = array[j];array[j] = temp;}///冒泡排序1///void bubblesort1(int[] array){for (int i = 0; i < array.Length;i++ ){for (int j = i + 1; j < array.Length;j++ ){if (array[i] > array [j]){swap(array, i, j);}}}}///冒泡排序2///void bubblesort2(int[] array){for (int i = 0; i < array.Length; i++){for (int j = array.Length-1; j >=i; j--){if (array[i] > array[j]){swap(array, i, j);}}}}///冒泡排序3///void bubblesort3(int[] array){bool flag = true;for (int i = 0; i < array.Length && flag; i++){flag = false;for (int j = array.Length - 1; j >= i; j--){if (array[i] > array[j]){swap(array, i, j);flag = true;}}}}

冒泡排序时间复杂度O(n2)

 简单选择排序:

简单选择排序//void selectSort(int[] array){int i,j,min;for (i = 0; i < array.Length-1; i++ ){min = i;for (j = i + 1; j <= array.Length-1;  j++){if (array[min] > array[j]){min = j;}}if (i != min){swap(array,i,min);}}}

简单选择排序时间复杂度O(n2)

 直接插入排序: 扑克牌

        /// <summary>/// //直接插入排序////// </summary>void insertSort(int[] array){int t,i, j;for (i = 1; i < array.Length; i++){if (array[i] < array[i - 1]){t = array[i];for (j = i - 1; j >= 0; j--){array[j + 1] = array[j];}array[j + 1] = t;}}}

直接插入排序时间复杂度O(n2)

  希尔排序:

  static void shellSort(int[] array){int i, j, temp;int increment = array.Length;do{increment = increment / 3 + 1;for (i = increment; i < array.Length; i++){if (array[i] < array[i - increment]){temp = array[i];for (j = i - increment; j >= 0 && temp < array[j]; j -= increment){array[j + increment] = array[j];}array[j + increment] = temp;}}}while (increment > 1);}

希尔排序时间复杂度O(n3/2)

不稳定

堆排序:

堆是具有下列性质的完全二叉树:

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;

每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆;

  static void HeapSort(int[] array){int i;for (i = array.Length / 2 - 1; i >= 0; i--)HeapAdjust(array, i, array.Length - 1);for (i = array.Length - 1; i >= 1; i--){swap(array, 0, i);HeapAdjust(array, 0, i - 1);}}static void HeapAdjust(int[] array, int i, int m){int temp, j;temp = array[i];for (j = 2 * i; j <= m; j *= 2){if (j < m && array[j] < array[j + 1])++j;if (temp >= array[j])break;array[i] = array[j];i = j;}array[i] = temp;}

时间复杂度O(nlogn)

不稳定

归并排序:

时间复杂度O(nlogn)

稳定

快速排序:

原始版本
  static void QuickSort(int[] array, int low, int high){int pivot;if(low < high){pivot = Partition(array,low,high);QuickSort(array, low, pivot - 1);QuickSort(array, pivot + 1, high);}}static int Partition(int[] array, int low, int high){int pivotkey = array[low];while (low < high){while (low < high && array[high] >= pivotkey)high--;swap(array, low, high);while (low < high && array[low] <= pivotkey)low++;swap(array, low, high);}return low;}
 

1 优化选取枢轴

优化后的快速排序:

     static void QuickSort(int[] array, int low, int high){int pivot;//优化小数组时的排序方案if ((high - low) > 50){//优化递归操作while (low < high){pivot = Partition(array, low, high);QuickSort(array, low, pivot - 1);//对低子表进行递归排序//QuickSort(array, pivot + 1, high);low = pivot + 1;//尾递归
                }}//else//直接插入排序                
        }static int Partition(int[] array, int low, int high){//优化选取枢轴int m = low + (high - low) / 2;if (array[low] > array[high])swap(array, low, high);if (array[m] > array[high])swap(array, m, high);if (array[m] > array[low])swap(array, m, low);int pivotkey = array[low];int temp = pivotkey;while (low < high){while (low < high && array[high] >= pivotkey)high--;//优化不必要的交换//swap(array, low, high);array[low] = array[high];while (low < high && array[low] <= pivotkey)low++;//优化不必要的交换//swap(array, low, high);array[high] = array[low];}array[low] = temp;return low;}

快速时间复杂度O(nlogn)

net SDK版本

void QuickSort(int[] map, int left, int right) {do {int i = left;int j = right;int x = map[i + ((j - i) >> 1)];do {while (i < map.Length && CompareKeys(x, map[i]) > 0) i++;while (j >= 0 && CompareKeys(x, map[j]) < 0) j--;if (i > j) break;if (i < j) {int temp = map[i];map[i] = map[j];map[j] = temp;}i++;j--;} while (i <= j);if (j - left <= right - i) {if (left < j) QuickSort(map, left, j);left = i;}else {if (i < right) QuickSort(map, i, right);right = j;}} while (left < right);}

不稳定

转载于:https://www.cnblogs.com/smileberry/archive/2013/02/01/2889579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue打包代码反编译_Android逆向反编译代码注入APK过程思路分析

一、名称解释逆向 - 是一种产品设计技术再现过程&#xff0c;从可运行的程序系统出发&#xff0c;运用解 密、反汇编、系统分析等多种计算机技术&#xff0c;对软件的结构、流程、算法、 代码等进行逆向拆解和分析&#xff0c;推导出软件产品的源代码、设计原理、结构、 算法、…

android 好玩的ui,让安卓更好玩 这些Launchers值得拥有

【手机中国新闻】如果你对Android的布局和界面越来越厌倦&#xff0c;那么是时候安装一个新的启动程序了。Launchers可以让你定制带有主题和图标包的智能手机&#xff0c;还可以在切换屏幕、启动应用程序等操作时&#xff0c;几乎完全控制手机的性能。以下是安卓智能手机或平板…

微星主板rgb_虽然这块主板价格有点小贵,但用过之后,感觉还是可以接受的

其实这块主板并不算贵&#xff0c;但它与其它型号&#xff0c;其它品牌的丐中丐主板相比&#xff0c;的确要贵好二、三百多元。对于有些用户而言&#xff0c;贵这几百元&#xff0c;完全就是一种赤裸裸的抢钱行为&#xff0c;所以早就在心里打上了“不值”的标签。能用丐中丐的…

三层架构学习的困难_“网工起航计划”3天集训营 带你了解大型企业网络架构设计!...

点击蓝字关注我们网工起航计划3天集训营 带你了解大型企业网络架构设计开营时间&#xff1a;8月26日晚8点DAY1&#xff1a;企业园区网二层架构冗余设计实战 时间:8月26日20:00-21:301、网络通信过程详细解析2、交换机工作原理详解3、企业园区网二层架构冗余设计涉及技术点&a…

mvn 汇编_2020年简单的早安共勉句子短信汇编58条

2020年简单的早安共勉句子短信汇编58条爱情&#xff0c;就像两个人在拉猴皮筋&#xff0c;疼的永远是后撒手的那个。早安&#xff01;以下是小编为大家推荐的早安共勉句子58条,欢迎大家借鉴与参考&#xff0c;希望对大家有所帮助。1、这地球少了谁都照样转&#xff0c;就是少了…

华为p50预装鸿蒙系统,华为P50系列将至,内部测试预装鸿蒙系统,还有4款重磅新品将发布...

2021年的上半年旗舰手机发布时间相较往年提前很多&#xff0c;小米11甚至赶在2020年12月份就带着骁龙888处理器强势登场&#xff0c;随后包括iQOO7、vivo X60 Pro系列、realme GT、Redmi K40系列以及众多国产新旗舰机型相继登场&#xff0c;如今包括OPPO、一加科技等厂商也已经…

ASP.NET中的Menu控件的应用

1、首先建立一个Default.aspx的主页面&#xff0c;再建立一个站点地图&#xff1a;Web.sitemap 2、Default.aspx的主页面的设计 <% Page Language"C#" AutoEventWireup"true" CodeBehind"Default.aspx.cs" Inherits"Menu控件1.Default&q…

synchronized原理_synchronized 关键字底层原理

synchronized 关键字底层原理属于 JVM 层面。① synchronized 修饰同步语句块public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("synchronized 代码块");}} }通过 JDK 自带的 javap 命令查看 SynchronizedDemo 类的相…

滑动窗口机制

(1).窗口机制 滑动窗口协议的基本原理就是在任意时刻&#xff0c;发送方都维持了一个连续的允许发送的帧的序号&#xff0c;称为发送窗口&#xff1b;同时&#xff0c;接收方也维持了一个连续的允许接收的帧的序号&#xff0c;称为接收窗口。发送窗口和接收窗口的序号的上下…

第一学期《计算机网络》作业一_新学期学习计划合集5篇-其他范文

[前言]新学期学习计划共含5篇&#xff0c;由好范文网的会员投稿推荐&#xff0c;小编希望以下多篇范文对你的学习工作能带来参考借鉴作用。第1篇&#xff1a;新学期学习计划这篇新学期学习计划范文是我们精心挑选的&#xff0c;但愿对你有参考作用。说来惭愧&#xff0c;上课好…

Java概览(java语言编程艺术笔记)

Java入门&#xff08;1&#xff09;——注释&#xff0c;面向对象&#xff0c;问题分解 注释 简单程序里广泛注释显然是愚蠢的&#xff0c;但是设计更大的&#xff0c;更复杂的程序是一种非常有用的记录。 面向对象 扩展类的实例同时也是现有类的实例。 这个怎么理解&#xff1…

鸿蒙os开源邀请全球开发者,全场景无缝连接 鸿蒙OS开源邀请全球开发者共助生态发展...

原标题&#xff1a;全场景无缝连接 鸿蒙OS开源邀请全球开发者共助生态发展万众瞩目之下&#xff0c;鸿蒙OS终究还是亮相了。在今日开始的华为开发者大会(HDC)上&#xff0c;我们熟悉的消费者业务CEO余承东首个登场&#xff0c;在回顾了华为消费者业务之后&#xff0c;余承东话题…

java 内嵌调用_Java高级开发必会的50个性能优化的细节(珍藏版)

在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。● 1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担&#xff0c;缩短加载的时间&#xff0c;提高加载的效率…

SDL教程4——在VS2010中设置SDL扩展库

前几节我们了解到&#xff0c;SDL基本库只能加载普通的BMP图像&#xff0c;如果我们还想加载其它格式的图片&#xff0c;我们就需要用到SDL的扩展库&#xff0c;它可以帮助我们加载BMP, PNM, XPM, LBM, PCX, GIF, JPEG, TGA and PNG等格式图片。要下载SDL扩展帮助文档&#xff…

html居右显示语言设置,iOS开发:纯代码设置UIButton文字居左或者居右显示

UIButton这个控件使用&#xff0c;作为资深的iOS开发人员来说是小儿科&#xff0c;但是有些时候还是需要记录一下UIButton的一些其他用法&#xff0c;这样方便快速解决实际问题。比如UIButton的纯代码编程的时候&#xff0c;设置文字居左显示&#xff0c;这个问题虽然简单的不能…

联想一体机电源键不亮_联想电脑一体机B505拆机经验

我修复联想电脑一体机的经验分享退休之后我较多的时间就是使用电脑&#xff0c;上上网&#xff0c;玩玩游戏&#xff0c;更多的是用电脑使用ps修图&#xff0c;修整照片。同时给自己的书法作品美化美化。很是方便。我这台b505的电脑&#xff0c;整体配置不错&#xff0c;就是一…

电脑入门完全自学手册_室内设计CAD施工图识读手册

室内设计全案行业班学习分为三个学习阶段第一阶段&#xff1a;软件技能学习&#xff0c;包括CAD、3DMAX、SU、PS、办公软件等第二阶段&#xff1a;设计理论学习&#xff0c;包括客户分析、方案设计、材料采买、工艺选用、预算造价等第三阶段&#xff1a;工程项目实战&#xff0…

[转]宝文!Apple Push Notification Service (APNS)原理与实现方案

原理 简单的说&#xff0c;app要单独实现消息动态更新&#xff0c;一种是轮询&#xff0c;这对用户来说会带来额外的流量。另一种方案是push&#xff0c;app client和server直接保持一个长连接&#xff0c;有新的消息时server push给app client。 这两种通过app自身实现的“pus…

if 组件是否存在_UE4 UMG简介+Slate组件问题排查

Slate 组件问题排查总结简介首先是一个工作中遇到的BUG&#xff1a; 用slua添加子节点到父节点上的时候&#xff0c;第二次打开无法显示对应的子节点Widget。对应Lua代码如下local comboBox ui_manager.ShowUI(ui_manager.UI_Config.ui_coupon_combobox,2,price,buyUIInfo.sho…

浏览器登录_经常用浏览器自动登录忘记了密码?教你一键查看网页星号密码

不知道大家有没有出现这种情况&#xff0c;因为一直用的网页自动填写密码来登录&#xff0c;所以有时候甚至把密码给忘了相信有的小伙伴有可能就会出现这种情况哈&#xff0c;今天小林君来教你个超简单的方法&#xff0c;不用安装任何软件&#xff0c;就可以一键查看网页上隐藏…