Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每一个排列前加上前缀ri得到的排列. R的全排列可归纳定义如下: 当n=1时,Permutation(R)={r},r是集合R中唯一的元素: 当n>1时,Permutation(R)由(r1)Permutation(R1…
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O(1). HashMap(std::unordered_map).HashSet(std::unordered_set)的原理与Hash Table一样,它们的用途广泛.用法灵活,接下来侧重于介绍它们的应用. 相关LeetCode题: 706. Design HashMap  题解  705. Des…
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态.紧接下来的状态仅与当前状态有关.和分治.动态规划一样,贪心是一种思路,不是解决某类问题的具体方法. 应用贪心的关键,是甄别问题是否具备无后效性.找到获得局部最优的策略.有的问题比较浅显,例如一道找零钱的题目 LeetCode 860. Lemonade Change: // 860. Lemonad…
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺序访问数组.按下标取值是对数组的常见操作. 相关LeetCode题: 905. Sort Array By Parity  题解 922. Sort Array By Parity II  题解 977. Squares of a Sorted Array  题解 1150. Check If a…
一.数据结构基础     a.什么是数据结构          b.数据结构的分类         c.列表           import random from timewrap import * def list_to_buckets(li, iteration): """ :param li: 列表 :param iteration: 装桶是第几次迭代 :return: """ buckets = [[] for _ in range(…
数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定.规律: 1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动) for( i=cnu;i>=pos;i--) pBase[i]=pBase[i-1]; 2.删除数组第pos位置的元素 for(i=pos+1;i<=cnu;i--)…
php数据结构课程---1.数据结构基础介绍(程序是什么) 一.总结 一句话总结: 程序=数据结构+算法 设计好数据结构,程序就等于成功了一半. 数据结构是程序设计的基石. 1.数据的逻辑结构和物理结构是什么? 逻辑结构:比如线性链表,树,图 物理结构:就是数据的存储结构 2.数据的物理存储方式有哪些,并且各自的优缺点是什么? 顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现.一般适用于线性的数组和链表,对于非线性的树和图则不适合. 链接存…
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shift_up操作,时间复杂度O(logn). 堆是优先级队列(Priority queue)的底层数据结构,较常使用优先级队列而非直接使用堆处理问题.利用堆的性质可以方便地获取极值,例如 LeetCode 题目 215. Kth Largest Element in an Array,时间复杂度O(nl…
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi…
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如LeetCode题目 104. Maximum Depth of Binary Tree: // 104. Maximum Depth of Binary Tree int maxDepth(TreeNode* root) { ; +max(maxDepth(root->left),maxDepth(roo…
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size n) if(n < k) solve x directly and return else divide x into a subproblems of size n/b call f recursively to solve each subproblem Combine the results…
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往尾(或从尾到头)遍历,我称之为同方向指针,第一个指针用于遍历,第二个指针满足一定条件下移动.例如 LeetCode题目 283. Move Zeroes: // 283. Move Zeroes void moveZeroes(vector<int>& nums) { ; ;j<nu…
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面对图相关问题,第一步是将问题转为用图表示(邻接表/邻接矩阵),二是使用图相关算法求解. 相关LeetCode题: 997. Find the Town Judge  题解 1042. Flower Planting With No Adjacent  题解 图的遍历(DFS/BFS) 图的遍历/搜索…
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以用递归.堆栈(stack)实现DFS过程. 关于广度优先搜索(BFS)详见:算法与数据结构基础 - 广度优先搜索(BFS) 关于递归(Recursion)详见:算法与数据结构基础 - 递归(Recursion) 树的遍历 DFS常用于二叉树的遍历,关于二叉树详见: 算法与数据结构基础 - 二叉查找树…
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以及平衡二叉树的构建与查找,然后还聊了哈希表的构建与查找.接下来的几篇博客中我们就集中的聊一下常见的集中排序方式,并并给出相应的时间复杂度.本篇博客我们将会详细的介绍冒泡排序.插入排序.希尔排序以及选择排序,下篇博客将继续介绍堆排序.归并排序以及快速排序的相关内容.当然上述内容的代码实现我们依然采用S…
1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序. 开始时已排序集合为空,而未排序集合即为整个数组.当排序开始后插入一个对象,已排序集合元素数目加1,相应地未排序集合元素数目减1,重复插入过程直至将未排序集合清空为止,这时排序集合就是最终结果.如下图: C++实现如下,为了使得程序可以对各种基本数据类型都能排序,使用了模板类,注意模板类的类声明和成员函数实现必须在同一个cpp文件里面,不能分开!! #ifndef INSERTSORT_H #d…
问题: 信息世界中,计算机是加工处理的信息的载体,在这个过程中面临着三个问题: 1.如何方便高效的组织数据 2.如何在计算机中存储数据(内存和外存) 3.如何对存储的数据进行高效的操作 目的: 我们都知道,我们都会表述一件事,老板交代你一件事情,你要陈述给你的员工,让他们明白你的意思,有些人可能简要的几句话 就把事情表达清楚,可是有的人说了一大堆才明白他说什么,这个比喻不太恰当,同样在面对同一个程序的时候我们就可以出现两 种程序:有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问…
一.链表基础 动态数组.栈.队列底层都是依托静态数组实现的,靠resize来解决固定容量问题. 链表是真正的动态数据结构,是一种最简单的一种动态数据结构. 更深入的理解引用(或者指针). 更深入的理解递归. 辅助成其他数据结构. 二.链表 LinkedList 数据存储在“节点”(Node)中 class Node{ E e; Node next; } 最后一个节点nxet = null 优点:真正的动态,不需要处理固定容量的问题. 缺点:丧失了随机访问的能力(即给出索引直接得到索引位置的元素)…
一.栈 Stack 栈也是一种线性的数据结构 相比数组,栈相对应的操作是数组的子集. 只能从一端添加元素,也只能从一端取出元素.这一端成为栈顶. 1,2,3依次入栈得到的顺序为 3,2,1,栈顶为3,只能取出栈顶的元素3(出栈). 栈是一种后进先出的数据结构 LIFO(Last In First Out) 栈的应用 1.无处不在的Undo操作(撤销) 2.程序调用的系统栈 编程时,用到子过程调用时,当一个子过程执行完成之后自动回到上层中断的位置: 系统栈记录每次调用过程中中断的那个点 funct…
python中基础的数据类型包括: 1 Number(数字) 2 String(字符串) 3 List(列表) 4 Tuple(元组) 5 set(集合) 6 Pictionary(字典) 按照可变数据和不可变数据来区分: 不可变数据(3个):Number(数字),String(字符串),Tuple(元组) 可变数据(3个):List(列表),Dictonary(字典),set(集合) 创建方式: 创建列表: listT=[1,2,3,4,5] 创建元组:tup2=(1,2,3,4,5) 创建字…
一.数组基础 1.数组,即把数据码成一排存放. 数组优点:快速查询. 数组最好应用于“索引有语意”的情况,但并非所有有语意的索引都适用于数组,数组也可以处理“索引没有语意”的情况. 2.增.删.改.查,是研究数据结构的基本脉络. 设二次封装的数组的类Array<E>(类型为E,泛型),E[ ] data 基本参数有capacity和size. capacity为数组空间最多装的元素个数,即data.length. size为数组实际装的元素个数. 有些方法需要对size进行维护. 二. 动态数…
排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔排序(Shell Sort).堆排序(Heap Sort)等属于比较排序方法,比较排序方法理论最优时间复杂度是O(nlogn),各方法排序过程和原理见  可视化过程. 另一类是非比较排序,被排序元素框定范围的前提下可使用非比较排序方法,例如桶排序(Bucket Sort).计数排序(Counting…
Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将两个子集合并为一个子集 并查集是一种树形的数据结构,其可用数组或unordered_map表示: Find操作即查找元素的root,当两元素root相同时判定他们属于同一个子集:Union操作即通过修改元素的root(或修改parent)合并子集,下面两个图展示了id[6]由6修改为9的变化:   …
滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑动窗口代码框架如下: //3. Longest Substring Without Repeating Characters int lengthOfLongestSubstring(string s) { vector<,); //用于对窗口内的各个字符计数 ,end=,res=; //窗口计数器…
Redis基础知识 1).测试redis服务的性能: redis-benchmark 2).查看redis服务是否正常运行: ping 如果正常---pong 3).查看redis服务器的统计信息: info 查看redis服务的所有统计信息 info [信息段] 查看redis服务器的指定的统计信息,如:info Replication 4).redis的数据库实例:作用类似于mysql的数据库实例,redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例…
一.插入排序介绍 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间.时间复杂度:O(n^2); 算法描述:     1.排序从第二个元素开始,第一个元素默认为有序的.     2.取出下一个元素(第一次取第二个,后面依…
一.结构体的创建 在C语言中,实现数据结构的一种常用方法便是使用结构体(structure)其示例代码如下: struct stu { int num; char ch; }; struct表示创建结构体 stu为结构体名称,里面的内容是各种变量类型(可以嵌套struct),然后使用示例如下: struct stu s; scanf("%d", &s.num); printf("%d\n", s.num); 第一行表示创建结构为stu的结构体s,此后访问结构…
一.队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素. (排队) 队列是一种先进先出的数据结构(先到先得)FIFO(First In First Out) 二.数组队列的实现(基于动态数组) Interface Queue<E> 接口设置5个方法 void enqueue(E e)   入队  O(1) 均摊 E dequeue() 出队  O(n) (出队后会将后续的元素向前挪一个单位,所以在出队操作上性能…
2-3树:是一种多路查找树,包含2结点和3结点两种结点,其所有叶子结点都在同一层次. 2结点:包含一个关键字和两个孩子(或没有孩子),其左孩子的值小于该结点,右孩子的值大于该结点. 3结点:包含两个关键字和三个孩子(或没有孩子),其左孩子的值小于关键字最小值,右孩子的值大于关键字最大值,中间孩子的值介于两个关键字之间. 2-3-4树:类似于2-3树,4结点包含三个关键字和四个孩子. B树:是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例,树中各结点中最大的孩子数目称为B树的阶. 一个…
树是一种一对多的逻辑结构,树的子树之间没有关系. 度:结点拥有的子树数量. 树的度:树中所有结点的度的最大值. 结点的深度:从根开始,自顶向下计数. 结点的高度:从叶结点开始,自底向上计数. 树的性质:①树的结点数等于所有结点的度数加1:②度为m的树中第i层上至多有mi-1个结点(i>=1):③度为h的m叉数至多有(mh-1)/(m-1)个结点:④具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)]. 树的表示方法: ①双亲表示法(顺序表示法):根节点parent=-1 typede…