数据结构基础知识1

1. 数据结构介绍

数据结构(英语:data structure)是计算机中存储、组织数据的方式。

数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。

简单来说,数据结构是对大规模的数据进行一个合理的规划,提高操作效率


常见的数据结构

  • 栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。
  • 队列(Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。
  • 数组(Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。
  • 链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。
  • 树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。
  • 图(Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。
  • 堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。
  • 散列表(Hash table):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。

    2.时间复杂度

描述算法运行时间的函数


假设算法要处理的数据总量为x,x足够大。算法为了某种目的(查找,删除,添加...)消耗的计算次数为y.

  • y=ax+b   a是系数,b是常数       当x足够大,a b的值不足以影响x   y和x直接相关   y=x  O(n)
  • y=ax^2+bx+c    ab是系数,c是常数    当x足够大,abc的值不足以影响x  y和x^2直接相关  y=x^2  O(n^2)
  • y=a  a是常数     当x足够大,a 的值不足以影响x   y和x无关   y=1  O(1)
  • a^y=x  y=logax         O(logn)

2.1 长度为x的无序数组,从中找一个值a,求时间复杂度

 

第一个:查找的次数为1

第二个:查找的次数为2

....

最后一个:查找次数x

取平均:x/2

y=x/2                 y=x            O(n)

2.2 从1加到n求时间复杂度

x=1

for(int i=2;i<=n;i++){

        x=x+i;

}

y=x     O(n)

用等差数列求和公式

sum=(1+n)*n/2

y=1   O(1)

2.3 冒泡排序  对数组进行排序

原理:前后两两数据进行比较,大的数据往后走,小的数据往前走,一轮结束之后,一个数据到达正确位置。

第一轮:比较了x-1

第二轮:比较了x-2

第三轮:比较了x-3

第x-1轮:1

y=(x-1)+(x-2)+(x-3)+...+1

y=(x-1+1)*(x-1)/2=x*(x-1)/2=x^2/2-x/2

y=x^2      O(n/2)

2.4 有序数组用二分查找法查找数据

mid=(left+right)/2

left<=right

right=mid-1

left=mid+1

第一轮:left和right所取范围内数据总量为x  x/2^0  比较次数为1

第二轮:left和right所取范围内数据总量为x/2   x/2^1  比较次数为1

第三轮:left和right所取范围内数据总量为x/2/2   x/2^2  比较次数为1

第四轮:left和right所取范围内数据总量为x/2/2/2   x/2^3  比较次数为1

...

第k轮:left和right所取范围内数据总量为...     1       比较次数为1     y=log2x    O(logn)

                                                                x/2^(k-1)

x/2^(k-1)=1

2^(k-1)=x

k=log2x

总结

快速判断时间复杂度:

确定数据总量n

直接对数据规模下手 O(n)

k层关于n的循环  O(n^k)

循环减半O(logn)

2.5 数组

根据下标获取值O(1)

无序数组查找O(n)


 

2.5.1 无序数组查找降低时间复杂度

方法一:有序数组二分查找法O(logn)

排序O(n^2)+二分查找O(logn)


方法二:通过某一个算法决定数据要插入的位置---->位置=n%arr.length

哈希算法

哈希表

两个不同的数值计算出来在同一个位置----->拉链法:在这个位置加入链表

哈希碰撞

链表长度不长O(1),链表很长O(n)

2.5.1.1 链表

单向链表 

双向链表

 


 

 方法三:有序二叉树

一个节点左边的值要比当前节点小,右边节点的值要比当前节点值大

10 5 20 8 15 30 1

第一层  1  2^0

第二层  2   2^1

第三层  4  2^2

第四层   8  2^3

....

第k层       2^(k-1)

x=2^0+2^1+2^2+...+2^(k-1)

x=2^k-1

k=log2x      O(logn)


1 2 3  4 5 6

不稳定

平衡二叉树

一个节点左边的值要比当前节点小,右边节点的值比当前节点值大

一个节点左边子树的高度  和右边子树的高度  高度差的绝对值不超过1

LL     LR     RR   RL 

LL

LR型旋转

RR型旋转

RL型旋转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值