zoukankan      html  css  js  c++  java
  • 4 顺序表和链表

    时间复杂度-  哪一项在表达式里面权重最大
    数据结构-   就是对基本数据(int float .. )的一种组织形式    容器就是数据的存放   {{}} O(1)效率最高
    算法和数据结构之间的关系
        数据的不同组织形式会影响算法对数据进行相关操作的效率不同
    timeit 平均耗时
        from timeit import Timer
        t  = Timer('func()','相关设置/from __main__ import func1()')   要是回调的话就不要参数二了 直接放函数
        t.timeit(1000)
    计算机只能存储二进制数据  也就只能运算二进制数据
    变量
        就可以表示计算机中的某一块内存空间
        内存空间会有2个默认属性:
            地址  16进制数表示
            大小(可以存怎样的数据量)  整数4字节  64位机8字节
    
    引用  就是(变量)   存储的都是一块内存地址
    指向  如果某一个引用/变量存储了某一块内存空间的地址之后,则表示该引用指向了该内存空间
    
    不同的数据占用内存的大小:
        int 4byte
        char 1byte
         float 4
         double 8
    顺序表
        集合中存储中的元素师有顺序的,顺序表的结构可以分为2种: 单数据类型/多数据类型
        python中的list tuple 就属于多类型的顺序表
        numpy array 就是单类型
    
    单数据类型顺序表的内存图(内存连续开启)
        元素是连续存的
        顺序表变量的指向 存的 内存空间的首地址
    
    多数据类型顺序表的内存图(内存非连续开启)  元组 列表
        想把数据存储到内存中,必须先在内存中开辟指定大小的内存空间(大小,地址:定位)
        如果一个引用指向了某一块内存空间,则表示该引用存储了该内存空间的地址
    
    顺序表的弊端 -- 顺序表的结构需要预先知道数据的大小来申请连续的存储空间,而在进行扩充时候又需要进行数据的搬迁
    单链表  -- 可以更加充分的利用计算机的内存空间,实现灵活的内存动态管理且进行扩充时候不需要进行数据搬迁
    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)
    . is_empty():链表是否为空
    . length():链表长度
    . travel():遍历整个链表
    . add(item):链表头部添加元素
    . append(item):链表尾部添加元素
    . insert(pos, item):指定位置添加元素
    . remove(item):删除节点
    . search(item):查找节点是否存在
    class Node():  #封装节点
        def __init__(self,item): #初始化
            self.item = item  #节点中的数据
            self.next = None  #
        def __str__(self):  
            return self.item
    
    class Link():  #封装链表
        def __init__(self):
            self._head = None  #该属性永远指向第一个节点
    
        def isEmpty(self):  #判断链表是否空?
            return self._head == None  #布尔值
        def add(self,item):  #每次都在头部        
            node = Node(item) #实例化 创建一个新节点对象       
            node.next = self._head #将节点插入到链表头部
            self._head = node
        def travel(self): #遍历
            cur = self._head  #第一个节点
            while cur: #最后一个cur就是None
                print(cur.item)
                cur = cur.next
    #add向头部添加    最后一个节点的next是None
        def length(self):  #长度
            count = 0
            cur = self._head
            while cur:
                count+=1
                cur = cur.next
            return count
    
        def append(self,item):  #尾部添加
            cur = self._head   #第一个节点
            pre = None    #cur前面节点的地址  
            node = Node(item)  # 新node
            # 当链表为空则新节点作为链表的第一个节点
            if self._head is None:
                self._head = node  #node
                return 
            # 链表非空对应的插入情况
            while cur:
                pre = cur  #该节点前的一个节点
                cur = cur.next 
            pre.next = node   #cur在空的位置  next指向node
    
        def insert(self,pos,item):  #位置 数据
            cur = self._head 
            pre = None 
            node = Node(item)
            length = self.length()  #长度
            if pos > length:   #大于链表数据长度  就追加在最后
                self.append(item)
                return
            if pos <= 0: #第一项
                self.add(item)
                return
            # 正常处理
            for i in range(pos):
                pre = cur
                cur = cur.next
            pre.next = node
            node.next = cur
    
        def remove(self,item): #删除
            cur = self._head  #定位到第一个
            pre = None
            # 如果删除的是第一个节点
            if item == cur.item:
                self._head = cur.next
                return
            # 正常 中间的
            while cur:
                if cur.item == item:
                    pre.next = cur.next
                    return
                else:
                    pre = cur
                    cur = cur.next
    
        def search(self,item): #搜索
            find = False
            cur = self._head   #定位到开始
            while cur:
                if cur.item == item: #找到了
                    find = True
                    break   #退出循环
                cur = cur.next  
            return find 
    
    link = Link()
    link.add(10)
    link.add('aa')
    link.append('bobo')
    link.append('bobo1')
    link.insert(111,666)
    # link.remove('aa')
    link.travel()  # aa 10 bobo bobo1 666 这是结果
    print(link.length())
    link.search(6669)
  • 相关阅读:
    robotium 测试android渠道包,采用批处理+robotium脚本的方式
    android手机中360手机卫士 VS 腾讯手机管家 VS 金山手机助手,谁更霸道?
    问题解决:INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for
    robotium做划屏操作函数scrollToSide ,坑爹
    eclipse创建测试apk文件的测试工程,报错java.lang.NullPointerException
    jdk 1.7下,apk重签名的bat
    aapt.exe查看apk文件的versionCode
    JMETER 2.10的安装
    2.js基础
    1.js基础
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10884344.html
Copyright © 2011-2022 走看看