数据结构

数据结构与算法系列六(栈)

自作多情 提交于 2020-02-29 13:15:32
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 你还记得在数组那一篇中,我们说过基于线性表的数据结构有哪些吗?它们是:数组

wpa_supplicant软件架构分析

三世轮回 提交于 2020-02-29 12:33:44
struct socket 数据结构 interface network callback 目录 (?) [+] 启动命令 wpa_supplicant 初始化流程 main函数 wpa_supplicant_init函数 wpa_supplicant_add_iface函数 wpa_supplicant_run函数 Wpa_supplicant提供的接口 上行接口 Dbus接口 Unix domain socket 接口 下行接口 Control interface commands 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c/data/wifi/wpa_supplicant.conf -f/data/wifi/wpa_log.txt wpa_supplicant 对于启动命令带的参数,用了两个数据结构来保存, 一个是 wpa_params, 另一个是 wpa_interface. 这主要是考虑到 wpa_supplicant 是可以同时支持多个网络接口的。 wpa_params 数据结构主要记录与网络接口无关的一些参数设置。 而每一个网络接口就用一个 wpa_interface 数据结构来记录。

数据结构的一些概念

我的未来我决定 提交于 2020-02-29 11:52:18
数据结构 就是研究数据的 逻辑结构 和 物理结构 以及他们之间的相互关系。 数据 :所有能被输入到计算机中,且能被计算机处理的符号集合,是计算机操作对象的总称。 数据元素 :数据中的一个“个体”,数据结构中讨论的基本单位。 数据项 :数据的不可分割的最小单位。一个数据元素有若干个数据项组成。 数据类型 :在一种程序设计语言中,变量所具有的数据种类,整型、浮点型、字符型等等。 逻辑结构 :数据之间的相互关系。 集合结构:数据元素除了同属于一种类型之外,没有无其他关系。 线性结构:数据元素之间是一对一的关系。 树形结构:数据元素之间是一对多的关系。 图状结构或网状结构:数据元素之间是多对多的关系。 物理结构 :也称为存储结构,是数据在计算机中的表示,是描述数据在内存中的存储,如顺序结构、链式结构、索引结构、哈希结构等等。 在数据结构中,从逻辑上可以分为 线性结构 和 非线性结构 。 数据结构基本操作的最重要准则是 实现应用程序与存储结构的独立 。实现应用程序是逻辑结构,存储的是物理结构。逻辑结构是对该结构操作的设定,物理结构是描述数据具体在内存中的存储。 顺序存储结构中 ,线性表的逻辑顺序和物理顺序总是一致的。 链式存储结构中 ,线性表的逻辑顺序和物理顺序一般是不同的。 算法的五个特性 :有穷性,确定性、可行性、输入、输出。 算法的设计要求 :正确性、可读性、健壮性、高效率与低存储需求

暑期任务安排

空扰寡人 提交于 2020-02-29 08:19:00
数据结构进阶 堆 倍增 并查集 树状数组/线段树 树上差分/树剖 点分治 分块/莫队/整体二分 CDQ分治/离线分治算法 主席树 动态规划 基础DP模型 :   线性DP   背包DP   区间DP   树型DP   状压DP   环形DP DP优化 :   倍增优化   单调队列优化   数据结构优化   斜率优化 图论 最短路 生成树 LCA 差分约束 缩点 连通性与双连通分量 二分图 数学知识 初等数论 线性求逆元 CRT 矩阵及应用 组合计数与容斥 莫比乌斯函数 概率与数学期望 来源: https://www.cnblogs.com/wuhan2005/p/11122202.html

LeetCode No.169,170,171

北城余情 提交于 2020-02-29 04:42:33
No.169 MajorityElement 多数元素 题目 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 输入: [3,2,3] 输出: 3 输入: [2,2,1,1,1,2,2] 输出: 2 思路 代码 No.170 TwoSum 两数之和 III - 数据结构设计 题目 设计并实现一个 TwoSum 的类,使该类需要支持 add 和 find 的操作。 add 操作 - 对内部数据结构增加一个数。 find 操作 - 寻找内部数据结构中是否存在一对整数,使得两数之和与给定的数相等。 示例 add(1); add(3); add(5); find(4) -> true find(7) -> false add(3); add(1); add(2); find(3) -> true find(6) -> false 思路 代码 No.171 TitleToNumber Excel表列序号 题目 给定一个Excel表格中的列名称,返回其相应的列序号。 示例 输入: "A" 输出: 1 输入: "AB" 输出: 28 输入: "ZY" 输出: 701 思路 代码 来源: https://www.cnblogs.com/zenronphy/p/12381397

数据结构与算法分析:(五)循环链表

自闭症网瘾萝莉.ら 提交于 2020-02-29 02:05:50
一、前言 相信小伙伴们在前面两篇文章的详细介绍已经对单向链表、双向链表有一个很清晰的认识了。 数据结构与算法分析:(三)单向链表 数据结构与算法分析:(四)双向链表 接下来我们来介绍循环链表,你把单向链表、双向链表搞清楚了的话,循环链表自然也不难了。 循环链表可分为:单向循环链表、双向循环链表。 1、单向循环链表: 单向循环链表跟单向链表唯一的区别就在 尾结点 。我们知道,单向链表的尾结点指针指向空地址,表示这就是最后的结点了。而单向循环链表的尾结点指针是指向链表的头结点。从我画的单向循环链表图中,你应该可以看出来,它像一个环一样首尾相连,所以叫作“单向循环”链表。 和单向链表相比,单向循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就特别适合采用单向循环链表。比如著名的 约瑟夫问题 。尽管用单向链表也可以实现,但是用单向循环链表实现的话,代码就会简洁很多。 2、双向循环链表: 双向循环链表想必也不用我多说了吧。 二、循环链表实战 假设有这么一个小游戏: 100个人围成圆圈,从1开始报数,喊到3人的时候退出,重复,直到剩下最后一个人。 看到围成圆圈,立马想到了 循环链表 这个数据结构。 1、我们先来定义循环链表的接口 public interface CircularLinkedList < E > { /** * 向链表插入一个元素,默认在尾部 *

数据结构与算法基础------计算时间复杂度

三世轮回 提交于 2020-02-28 23:26:01
算法效率从以下两个方面考虑: 时间效率:指的是算法所耗费的时间 空间效率:指的是算法执行过程中所耗费的存储空间 时间 效率和空间效率有时候是矛盾的。 在这里我们只讨论事前分析法,因为事后分析法也和计算机的软硬件等其他客观条件有关。 事前分析法 一个算法的运行时间大致等于计算机执行一种 简单操作 (如赋值,比较,移动等)所需的时间与算法中进行的 简单操作的次数的乘积 。 以矩阵为例: for ( i = 1 ; i <= n ; i ++ ) //n+1次 for ( j = 1 ; j <= n ; j ++ ) //n*(n+1)次 { c [ i ] [ j ] = 0 ; //n*n次 for ( k = 0 ; k <= n ; k ++ ) //n*n*(n+1)次 c [ i ] [ j ] = c [ i ] [ j ] + a [ i ] [ k ] * b [ k ] [ j ] ; //n*n*n次 } 那么上述算法所消耗的时间是该算法中每条语句的执行次数之和,则消耗的时间T(n)=2n 3 +3n 2 +2n+1。 为了便于比较不同算法的时间效率,我们仅比较他们的数量级。 若某个辅助函数f(n)(即只包含最高数量级的函数),使得当n趋近于无穷大时,T(n)/f(n)的极限值为 不等于零的常数 ,则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)

数据结构-图的最短路径之Djikstra算法(迪杰斯特拉算法)

三世轮回 提交于 2020-02-28 21:58:09
一. Djikstra算法定义 形式: 用来解决单源最短路径的问题,即给出图G和起点s,通过算法到达每个顶点的最短距离。 基本思想: 对图G(V, E)设置集合S, 存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点u,访问并加入集合S。之后,令顶点u为中介点, 优化起点和所有的从u能到达的顶点v之间的最短距离。这样的操作执行n(顶点的个数)次。 伪代码: //G为图, 一般设置为全局变量,数组d为源点到达各点的最短路径长度,s为起点 Djikstra(G, d[], s){ 初始化 for(循环n次){ u = 是d[u]最小的还未被访问的顶点的标号 记u已被访问 for(从u出发能到达的所有顶点v){ if(v未被访问&&以U为中介使得s到顶点v的最短距离d[v]更优){ 优化d[v] } } } } 二、具体实现 1. 邻接矩阵版 const int MAXV = 1000;//最大顶点数 const int INF = 10000000000;//设INF为一个很大数 //适用于点数不大的情况 int n, G[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]; void Dijkstra(int s){ fill(d, d+MAXV, INF); d[s] = 0; for(int i = 0; i < n; i

详解C结构体、C++结构体 和 C++类:本质、相同之处和区别

被刻印的时光 ゝ 提交于 2020-02-28 21:10:38
今天,我们来细说一个大家可能都想到过但是往往没有深究的问题:结构体和类的区别,这个问题在咱们面试的时候是可能被提问的(划重点),让我们从头来开始说起: 首先我们要明确概念,什么是数据结构?什么是数据类型? 定义如下: 数据结构:计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 数据类型:在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。 这样说比较准确但不直观,让我们来举个栗子: 各个数据是各式书本,比如说整数1、2是语文必修1和语文必修2,浮点数1.1、1.2是高数上册和下册。那我们每个学期呢,都要学习,各个科目,那第一学期我们的书包里会需要放置语文1和高数上,这两者差异明显,但是我们这学期都要学,我们就把他们放到一起,到下学期两本一起替换,他们被学期的需要联系在一起,这就是数据结构,我们把他们放到一起便于日常使用,计算机把数据放在一起提高效率。而接下来,我们知道语文必修1和语文必修2都是语文,他们在形式和目的上都相似但内容不同,这不正像是两个整形数1和2?这就叫做数据类型。 他们的常见表现: 数据结构:数组、栈、队列、链表、树、图、堆、散列表等。 数据类型:基本数据类型(byte、short、int、long