数据结构之散列表
[TOC]
散列散列表是元素集合,其中的元素以一种便于查找的方式存储。散列表中的每个位置通常被称为槽,其中可以存储一个元素。
散列函数将散列表中的元素与其所属位置对应起来
例如:取余函数%11
将计算出的散列值插入散列表的对应位置
**载荷因子(λ)**:散列表的占用率
散列冲突:元素77在散列表的0位置,如果再来一个元素44,它的散列值也是0。将两个元素都放入同一个槽,这种情况被称作冲突,也叫“碰撞”
完美散列函数:给定一个元素集合,能将每个元素映射到不同的槽,这种散列函数称作完美散列函数。
如果元素已知,并且集合不变,那么构建完美散列函数是可能的。
不幸的是,给定任意一个元素集合,没有系统化方法来保证散列函数是完美的。
散列函数要求:冲突数最少,计算方便,元素均匀分布于散列表中。
构建完美散列函数方法:
增大散列表:使之能容纳每一个元素,这样就能保证每个元素都有属于自己的槽,元素多时候不可取
散列函数一定要高效,以免它成为存储和搜索过程的负担。如果散列函数过于复杂,计算槽编号的工作量可能比在进行顺序搜索或二分搜索时的更大,这可不是散列的初衷。
举例: ...
算法之搜索和排序
[TOC]
搜索
搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回True或False,分别表示元素是否存在。有时,可以修改搜索过程,使其返回目标元素的位置。
顺序搜索存储于列表等集合中的数据项彼此存在线性或顺序的关系,每个数据项的位置与其他数据项相关。
在Python列表中,数据项的位置就是它的下标。因为下标是有序的,所以能够顺序访问,由此可以进行顺序搜索。(遍历)
无序列表的顺序搜索12345678910def sequentialSearch(iters,item): found = False for i in iters: if i == item: # return found := True # 海象表达式,它可以在条件语句、循环语句等场景下使用,但不能直接与返回语句结合。 found = True return found return found
有序列表的顺序搜索假设列表中的元素按升序排列。如果存在目标元素,那么它出现在n个 ...
算法之动态规划
[TOC]
找零
用最少的硬币
1、如果当前剩余找零金额等于已有硬币面额,递归返回
2、拆分,按照硬币面额,先给一枚硬币,余下金额继续递归
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152# 动态规划:找零def recMC(coinValueList,change): minCoins = change if change in coinValueList: return 1 else: for coin in [c for c in coinValueList if c<=change]: numCoins = 1+recMC(coinValueList,change-coin) if numCoins<minCoins: minCoins = numCoins return minCoinsde ...
python之内置数据类型
[TOC]
列表存储结构在Python中,列表(List)是一种动态数组。
列表的存储结构是基于数组实现的,每个元素在内存中都是连续存储的。
当创建一个列表时,Python会为其分配一块连续的内存空间来存储元素,列表的长度可以根据需要动态增长或缩小,如果该列表没有连续的内存空间剩余,则会在内存其他空闲位置重写开辟一块内存,并深复制到其中。
还会分配另外一块内存空间来存储索引数组。索引数组中的每个元素对应着相应元素在列表内存空间中的位置。
时间复杂度
在列表末尾调用pop时,操作是常数阶的,在列表头一个元素或中间某处调用pop时,则是n阶的
切片列表切片是通过创建一个新的列表对象,然后浅拷贝其中的元素。但列表中的元素仍然是原始列表中元素的引用。修改切片后的列表元素也会影响到原始列表的对应位置元素,因为它们指向的是同一个内存地址。这意味着对于带嵌套的列表,其中的复合对象无法做到数据隔离。
1234567891011# 切片(浅拷贝)original_list = [1, 2, 3, 4, 5]sliced_list = original_list[1:4]print(origi ...
数据结构之栈、队列和递归
[TOC]
栈(stack)
栈是一种只能在一端进行操作的线性表,它最大的特点是进行数据操作时必须遵循“后进先出(Last In FirstOut,LIFO)”的原则
术语
栈顶(top):可以进行增删改查操作的一端
栈底(bottom):无法进行上述操作
栈的基本操作
栈的抽象数据类型的定义
栈的顺序存储
123456789101112131415161718192021222324252627282930313233343536class SequenceStack: def __init__(self): self.stack = [] self.top = -1 def push(self,data): self.stack.append(data) self.top += 1 def pop(self): if self.is_empty(): raise IndexError("Stack is empty") ...
python之方法重载
[TOC]
方法重载
以相同的方法名定义不同的方法,在不同条件下自动选择正确的版本进行调用,这就被称为方法重载。方法重载(Method Overloading)是面向对象的编程语言中经常用到的一个特性
在Python这种动态语言中,没有严格的类型约束,也没有重载的概念。
方法重载的过程简单来说,就是对不同的输入进行检查,然后派发给不同代码。
利用参数类型和数量实现方法重载
在Python中,两个或多个方法不能有相同的名字,所以在方法内进行重载
1234567891011def fun(a,b,c=None): if c is not None: #检查 print(a,b,c) #派发 else: if type(a) == int: #检查 print(a+b) #派发 else: print(a,b) #在此例中,参数数量有(a,b)和(a,b,c)的不同,我们用if检查是否有c参数,然后执行if下的代码,实现派发#参数类型有a:int和a:其他类型,也是用if typ ...
数据结构之线性表
[TOC]
线性表概述定义:线性表是由若干个具有相同特性的数据元素组成的有限序列
栈、队列、双端队列和列表都是有序的数据集合,其元素的顺序取决于添加顺序或移除顺序。一旦某个元素被添加进来,它与前后元素的相对位置将保持不变。这样的数据集合经常被称为线性数据结构。
形式:{a[1],a[2],…,a[i],…,a[n]}
概念:直接先驱元素、直接后继元素、表头、表尾
逻辑结构:
类型:有序线性表和无序线性表
特性:
元素个数一定是有限的
所有元素具有相同的性质
除表头元素以外,其他所有元素都有唯一的(直接)先驱元素,除表尾元素以外,其他所有元素都有唯一的(直接)后继元素
抽象数据类型:
顺序表顺序表概念
顺序表是指采用顺序存储的方式来存储数据元素的线性表
将结点依次存放在一组地址连续的存储空间中
顺序表的操作顺序表基本操作的SequenceList类
链表
链表是指采用链式结构来存储数据元素的线性表
链表的特点:
链表实现了存储空间的动态管理。
链表在执行插入与删除操作时,不必移动其余元素,只需修改指针即可。
存储密度:衡量存储空间的使用效率
顺序表的存储 ...
数据结构概述
[TOC]
数据结构概述
数据结构是指所有数据及这些数据之间的关系的集合
相关概念对于计算机而言,数据是指能被输入到计算机中并能被其处理的符号的集合
数据通常用于描述客观事物
数据元素是数据的基本单位
数据项是构成数据元素的不可分割的最小单位,也被称为字段、域或属性
数据对象是性质相同的数据元素的集合,是数据的一个子集,例如整数、字母
数据结构是相互之间存在一种或多种特定关系的数据元素的集合,通常这些数据元素都不是孤立存在的,而是通过某种关系将所有数据元素联系起来,我们将这种关系称为结构
逻辑结构数据元素之间的逻辑结构是多种多样的,根据数据元素之间的不同关系特性,通常可将数据逻辑结构分为4类,即集合、线性结构、树形结构和图状(或网状)结构
线性结构:该结构中的数据元素之间存在一对一的逻辑关系,并且起始元素和终端元素都是唯一的,除了这两个元素外,剩余的每一个元素都有且仅有一个在其之前和在其之后的元素
树形结构:该结构中的数据元素之间存在一对多的逻辑关系,并且除了起始元素外,其余每一个元素都有且仅有一个在其之前的元素,除了终端元素外,其余每一个元素都有一个或多个在其之后的元素
网状结 ...
Appium
Appium简介