数据结构的简单概念

本文介绍了数据结构的基本概念,包括数据类型、数据结构如栈、队列、链表、字典的特性和实现。栈遵循后进先出原则,队列则是先进先出,链表由节点组成,而字典是通过哈希表实现的高效查询结构。此外,还提及了树状数据结构和解决哈希冲突的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据结构是什么?

数据结构就是设计数据以何种方式存储在计算机中,我们所说的程序就是数据结构与算法的结合。

        数据类型:满足特定结构定义的一类集合上的总称算是一种数据类型,一个值的集合和定义在这个值上操作的总称。如:int,str,boolean,byte等

        数据结构:栈,队,链表,树,图,堆,散列表等

数据结构研究的三个方面: 
(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; 
(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; 
(3)对各种数据结构进行的运算。 
数据的逻辑结构: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。 
数据的存储结构:有顺序,散列,链接式,索引等。 
线性结构条件: (1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 
非线性结构:不满足线性结构条件的数据结构。

 (栈是一种只能在一端进行插入或者删除的数据结构)

特性:后进先出

python代码实现(自定栈,模拟进栈,取栈顶元素,出栈)

class stack(object):
    def __init__(self):
        self.stack=[]
    #压栈
    def push(self,i):
        self.stack.append(i)
    #获取栈顶元素
    def top(self,i):
        return self.stack[-1]
    #出栈
    def pop(self)
        self.stack.pop()

队列(在一端插入数据,在另一端删除的数据结构,插入的一段为队尾插入动作为入队,删除的一端为队头,删除动作为出队)

特性:先进先出,(双向队列两端都可以进行入队和出队)

python代码实现(自定队列,模拟入队,取队列元素,出队)

from queue import Queue
# 最大队列限制,入队时不能超过最大限制,不然会阻塞,知道有元素出队,才会再次入队
q = Queue(maxsize=5)
for i in range(5):
    q.put(i)
    print(q.queue)
for i in range(5):
    q.get()
    print(q.queue)

链表(单链表)(链表中每个元素都是一个对象,每个对象都是一个节点)

特性:链表分为数据域(存放当前节点数据)和指针域(指向下一节点的内存地址)

class Linked_list():
    def __init__(self,value,next=None):
        self.value=value
        self.next=next

l = Linked_list(1)
l.next = Linked_list(2)
l.next.next = Linked_list(3)

print(l.value) # 1
print(l.next.value) # 2
print(l.next.next.value) # 3

数组(类似与python中的列表,相同类型数据的按照一定顺序排列的集合,注意列表数据类型可以不同)

特性:其存储数据按顺序存储,so内存地址也是连续的,查(易,内存地址连续寻找简单),增删改(难)

字典(python的内置数据类型,存储的数据类型必须是不可变的,以键值对的方式存在例如{“key1”:“value1”,“key2”:“value2”},索引键==>值,字典底层是通过哈希表实现的,也称为哈希数组/散列数组,本质是数组)

特性:字典是一种可变,无序容器结构,空间换时间,so查询速度很快。

字典结构:如下

#开辟空间存储数据
hash_table = [
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
]

 hash函数计算hash值

dict = {"name1":"小白","name2":"小黑"}
# 通过把每个对象的关键字key作为自变量,通过一个哈希函数hash(key),将k映射到下标h(key)处,并将此对象存储在这个位置。
print(bin(hash("name1")),bin(hash("name1")))
>>> -0b100000111100100001000101101001110000011010000010010001111010011 -0b100000111100100001000101101001110000011010000010010001111010011
hash函数计算的值是多少​就存储在什么位置,没法做到有序,而却这种方法也很容易让哈希表稀疏,占用大量内存。
hash_table = [
    ['--', '--', '--'],
    [hash, name1, 小白],
    ['--', '--', '--'],
    ['--', '--', '--'],
    [hash, name2, 小黑],
]

​

 hash冲突:没有完美的算法,通过hash函数计算或多或少会产生hash冲突(值相同)

        解决办法:开放寻址法,链地址法(拉链法),再哈希法,建立公共溢出区

 有序字典:有序的字典把索引和哈希值、键、值单独分开

indices = [None, None, index,]
hash_table = [
    [hash0, key0, value0],
    [hash1, key1, value1],
    [hash2, key2, value2]
]

(它是由 n (n>=1)个有限节点组成一个具有层次关系的 集合,根朝上,枝朝下)

特性:非线性数据结构,存储一对多的数据元素的集合

树的种类:无序树,有序树,二叉树,满二叉树,完全二叉树,完满二叉树,霍夫曼树,二叉查找树,平衡二叉树,AVL树,红黑树,伸展树,替罪羊树,B树,B+树,B*树,字典树,线索二叉树

class tree():
    def __init__(self,root=None,left=None,right=None):
        self.root = root
        self.left = left
        self.right = right
t = tree("a",tree("b"tree("d"),tree("e")),tree("c",tree("f"),tree("g")))

B+树

hash树

红黑树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值