数据结构 python 语言描述

(一)数据结构综述

  • 常用的数据结构:数组(顺序表)、链表字典(哈希表)、搜索树
  • 图这种数据结构,一般用不到
  • 概念很无聊,直接上代码
  • 书:数据结构高分笔记,王道

 

(二)链表

 

 

 1 class Node(object):
 2     def __init__(self,element=None):
 3         self.element = element
 4         self.next = None
 5 
 6 # 这种创建链表的方法是非常野鸡的,这里主要是为了演示
 7 head = Node()
 8 n1 = Node(111)
 9 n2 = Node(222)
10 n3 = Node(333)
11 head.next = n1
12 n1.next = n2
13 n2.next = n3
14 
15 def log_link_list(head):
16     """
17     打印链表中所有的元素
18     """
19     n = head.next
20     while n.next is not None:
21         print(n.element)
22         n = n.next
23     print(n.element)
24     
25     
26 def append(head,element):
27     """
28     在链表的末尾添加元素
29     """
30     n = head
31     while n.next is not None:
32         n = n.next
33     node = Node()
34     n.next = node
35     node.element = element
36     
37     
38 def preappend(head,element):
39     """
40     链表的头插法
41     """
42     node = Node(element)
43     node.next = head.next
44     head.next = node
45     
46     
47 def pop(head):
48     tail = head
49     while tail.next is not None:
50         tail = tail.next
51     # 拿到最后一个元素的 pointer 了
52     n = head
53     while n.next is not tail:
54         n = n.next
55     n.next = None
56     return tail.element
57     
58 preappend(head,999)   
59 append(head,666)
60 log_link_list(head)
61 
62 pop(head)
63 log_link_list(head)

 

 

(三) 二叉树

 

 

class Tree(object):
    def __init__(self,element=None):
        self.element = element
        self.left = None
        self.right = None
        
    def traversal(self):
        """
        二叉树的前序,中序,后续遍历
        改变 print 的位置就可以
        """
       
        if self.left is not None:
            self.left.traversal()
        if self.right is not None:
            self.right.traversal()
        print(self.element)
            
    def reverse(self):
        """
        交换左右子树
        """
        self.left, self.right = self.right, self.left
        if self.left is not None:
            self.left.reverse()
        if self.right is not None:
            self.right.reverse()

def test():
    # 手动构建二叉树,这种方法非常野鸡。就只有在学习的时候用
    # 在实际的应用中,一般都是自动生成的
    
    t = Tree(0)
    left = Tree(1)
    right = Tree(2)
    t.left = left
    t.right = right
    
    t.traversal()
    
if __name__ == '__main__':
    test()

 

 

 

(四)字典,又叫哈希表,Map等

  1. 这个方法很直接,我们先把一个字符串映射成一个整数

    如: ‘dog’ ------>   'd'*1 + 'o'*10 + 'g'*100

  2. data = [key, value] 我们插入的数据是一个个列表,采用链接地址

 

 

class HashTable(object):
    def __init__(self):
        self.table_size = 10007
        self.table = [0] * self.table_size

    # 这个魔法方法是用来实现 in  not in 语法的
    def __contains__(self, item):
        return self.has_key(item)
        
    def has_key(self, key):
        """
        检查一个 key 是否存在, 时间很短, 是 O(1)
        如果用 list 来存储, 需要遍历, 时间是 O(n)
        """
        index = self._index(key)
        # 取元素
        v = self.table[index]
        if isinstance(v, list):
            # 检查是否包含我们要找的 key
            for kv in v:
                if kv[0] == key:
                    return True
        return False

    def _insert_at_index(self, index, key, value):
        # 检查下标处是否是第一次插入数据
        v = self.table[index]
        data = [key, value]
        if isinstance(v, int):
            self.table[index] = [data]
        else:
            # 如果不是, 得到的会是 list, 直接 append
            self.table[index].append([data])

    def add(self, key, value):
        """
        add 函数往 hashtable 中加入一对元素
        我们先只支持字符串当 key
        """
        # 先计算出下标
        index = self._index(key)
        # 在下标处插入元素
        self._insert_at_index(index, key, value)

    def get(self, key, default_value=None):
        """
        这个和 dict 的 get 函数一样
        """
        index = self._index(key)
        # 取元素
        v = self.table[index]
        if isinstance(v, list):
            # 检查是否包含我们要找的 key
            for kv in v:
                if kv[0] == key:
                    return kv[1]
        return default_value

    def _index(self, key):
        # 先计算出下标
        return self._hash(key) % self.table_size

    def _hash(self, s):
        n = 1
        f = 1
        for i in s:
            n += ord(i) * f
            f *= 10
        return n


def test():
    import uuid
    names = [
        'web',
        'python',
    ]
    ht = HashTable()
    for key in names:
        value = uuid.uuid4()
        ht.add(key, value)
        print('add 元素', key, value)
    for key in names:
        v = ht.get(key)
        print('get 元素', key, v)


if __name__ == '__main__':
    test()

 

转载于:https://www.cnblogs.com/owenqing/p/10481399.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值