数据结构学习笔记

数据结构

hashtable实现

有一个非常大的数组来存放value值, 计算hashtable的value值

hash算法

对16进行取模,然后将值存在list中

index = value % 16

先将数据根据hash算法存放在table中,然后在查找时计算散列值

  • 用数组加链表来解决冲突
  • 确定hash函数

链表

转置

1

让第一个节点指向空,第二个节点指向第一个节点,第三个节点指向第二个节点….

用一个temp来记录当前节点
让当前节点指向reverseNode
reverseNode的值初始为None,
然后当前节点赋值给reverseNode,当前节点后移一位,让当前节点的下个节点指向reverseNode,也就是当前节点。
完成转置

while(currentNode)
temp=currentNode
currentNode=currentNode->next
temp.next=ReverseNode
ReverseNode=temp

链表转置的递归实现

一直调用反转函数,直到最后一个节点
NodeList * reverse(NodeList *p){

if p==Null || p .next==NULL
p=head
return p;

else :
p1==reverse(*p)
p=p1.next
p.next=Null
return p;

2

让第一个节点指向第三个节点,tempNode保存第二个节点,第二个节点指向第一个节点,然后第三个节点再指向第二个节点

依次添加在第一个节点的尾部b

链表转置的方法, 将left right作为缓冲,将当前节点的下一个元素缓存起来放在right中,将 当前节点指向left,(也就是他的上一个节点)
然后把当前节点放在left中,当前节点往后移一个
重复这个过程,所有节点都会指向他前面的那个节点了,也就是放在left中的
1->2->3->4
right=left=null
current=1
right=2
2->left
left=1

current=2
right=2 left=1
right=3
2->1
left=current=2

current=3
right=4 left=2->1
3->2->1
left=current=3
current=right=4

二叉树

完全二叉树
叶子节点只可能在最大的两层上出现


  • 顶点数等于所有度数+1

二叉搜索树 binary tree

左子树节点小于根节点,小于右子树节点
左右子树也是二叉搜索树

从小到大输出,应该是左中右 中序遍历

2 .前序遍历 根左右
中序遍历 左根右
后序遍历 左右根

b树

多路搜索树,用于数据库中

通过降低树的深度来减少查找的频率

降低深度的方法:

M序b树:

  • 任何节点最多有M个子节点
  • 任何非叶节点至少含有M/2个节点
  • 根节点至少还有两个子节点
  • b树只支持随机检索,b+树既支持随机检索也支持顺序检索

N个节点的M序b树的高度

第2层至少有两个点,

第3层每个点至少还有M/2个点。 2*M/2

第4次 2*(m/2)^2个点

第5层 2*(M/2)^3

第L层 2*(m/2)^(l-2)

l-1=log(m-2) *(N+1)/2+1

b+树的读写效率更高

霍夫曼树

根节点最大的堆叫做最大堆

根节点最小的堆为最小堆

插入 O(logn)

创建O(n)

堆排序

堆排序是完全二叉树

满二叉树:除了最后一层没有叶子节点外,其他节点都是满的,节点数达到了最大值

利用堆的性质,最大堆,子节点的值总小于父节点,最小堆相反

dfs 和bfs

判断图是否稀疏的方法

  • 动态规划,动态规划的原理

dfs 时间复杂度

数据结构dfsbfsdijkstraBellman-ford
邻接矩阵O(V2)O(V2)O(v2)O(VE)
邻接链表O(V+E)O(V+E)O(VE)
二叉堆O(V+E)logv)

算法和基础知识

中缀表达式

1+((2+3)×4)-5 转换为后缀表达式

  • 后缀表达式从左往右
    • 123+4×+5-
  • 前缀表达式从右往左
    • 5432+×

二分查找(根据元素找到下标)

首先是排好序的
根据元素找到下标:
middle=0+size;
if a[index]>a[middle]:
low=middle+1
else:
high=middle-1


链表

插入时间复杂度:O(1)
删除时间复杂度O(n)
删除尾部元素 需要知道链表长度

折半查找的平均次数

每次扫描全数组,找到中间的数,然后把数组分为两部分继续,
平均次数就是每个数扫描的次数全部加起来,然后除以数的总个数,即可

1,2,3,4,5,6,7,8,9,10
第一次找到6,6搜索了一次
1,2,3,4,5 ,7,8,9,10 两次
12,45, 78,9 10 3次
2 5 , 8 10 4次

计算方法:
将全部数字画作完全二叉树,然后每层节点数*书的高度加起来,除数目

kmp算法

排序

冒泡排序

1,2,4,345,546,5686,74,521,32,12,3,2,43,345,5,34,5

从左边选一个最大的数放在最右边,然后再从(0,i-1)中选一个最大的数放在最右边。
左右交换

快速排序

堆排序

  • 堆的插入时间复杂度,堆的数据结构有哪些

逆波兰数

数据进栈出栈

基础知识

反码

正数的反码等于他本身

负数的反码等于各项取反,符号位除外,第一位表示符号位

10010->11101

补码

正数的补码等于他本身,负数的补码等于反码+1

10010->11101->11110

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值