数据结构与算法
xiangzhihong8
著有《React Native移动开发实战》1,2,3版本、《Kotlin入门与实战》1,2版本、《Weex跨平台开发与实战》、《React Native开发进阶》和《Flutter跨平台开发实战》和《Android应用架构实战》和《鸿蒙应用开发与实战》、《Vue3 项目开发实战》即将出版
展开
-
初识动态规划算法
前面,我们对动态规划算法做了一个简单的介绍:算法之动态规划算法简介。下面,我们就动态规划算法做一下具体的介绍。硬币找零问题虽然说硬币找零在现实生活中越来越少,但它仍然活跃在编程领域和面试问题当中,主要还是因为它极具代表性,也能多方面考察一个开发人员或面试者解决问题的能力。首先,我们来看看这个算法问题的具体描述: 给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], … c[n],同时还有一个总金额 k,编写一个函数计算出最少需要几枚硬币凑出这个金额 k?同时,每种硬币的个数不限,如原创 2020-10-16 16:48:34 · 1495 阅读 · 0 评论 -
算法之动态规划算法简介
动态规划概述算法,是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。在现实生活中,算法具有如下一些特征:有穷性:指算法必须能在执行有限个步骤之后终止。确切性:算法的每一步骤必须有确切的定义。可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行操作步骤,即每个计算步骤都可以在有限的时间内完成。输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定义除了初始条件。输出项:一个算法有1个或多个输出,以反映原创 2020-10-16 11:20:45 · 980 阅读 · 0 评论 -
2017-2020历年字节跳动Android面试真题解析
本文内容网上转摘,原文地址:2017-2020历年字节跳动Android面试真题解析(累计下载1082万次,持续更新中)今年虽然受疫情影响,大部分同行都放慢和减缓了跳槽的计划和节奏,可仍有很多年前已经辞职的朋友,这部分朋友需要面临岗位减少、空前的竞争压力和心理压力的影响。但是字节跳动2020春招依然火热,于是总结了字节跳动最新、最全的Android岗位面试题。疫情期间正好有时间,我们就收集整理...原创 2020-03-10 16:50:55 · 3909 阅读 · 1 评论 -
数据结构之哈希函数
概念:哈希(hash),也叫做散列、数据摘要等,是一种常见的数据结构。哈希的表的核心概念分为哈希表和哈希函数。哈希表(hashTable)哈希表之前讲过,有需要的可以参考:点击打开哈希表哈希函数哈希函数就是将某一不定长的对象映射为另一个定长的对象。能够做到这一点的函数有很多,那什么可以作为哈希函数?这里我们首先要明确下什么可以作为哈希函数。如果两个不同的对象经过哈希函数计算后得到相同的哈希值,则这原创 2016-12-07 10:43:43 · 6820 阅读 · 0 评论 -
数据结构之队列
概述在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。Queue接口与List、Set同一级别,都是继承了Collection接口。Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候原创 2016-12-08 13:41:18 · 1230 阅读 · 0 评论 -
数据结构之线性表
基本概念线性表(List):由零个或多个数据元素组成的有限序列。特征:1.线性表是一个序列。2.0个元素构成的线性表是空表。3.线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。线性表抽象数据类型基于线性表的特征,线性表可以做如下操作: InitList(*L);//原创 2016-12-09 10:43:56 · 1429 阅读 · 0 评论 -
一起聊聊什么是P问题、NP问题、NPC问题
概念P问题:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。通常NOI和NOIP不属于P类问题,我们常见到的一些信息奥赛的题目都是P问题。 NP问题:可以在多项式的时间里猜出一个解的问题。NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题。之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。 所有的P类问题都是NP问题。也就原创 2016-12-22 18:13:39 · 11676 阅读 · 2 评论 -
数据结构之图
基本概念图(Graph):图(Graph)是一种比线性表和树更为复杂的数据结构。 图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何原创 2016-12-22 22:07:09 · 4415 阅读 · 0 评论 -
数据结构之二叉树
树定义:满足以下条件的就是树: 1. 有且仅有一个特定的称为根Root的结点。 2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一个棵树,并称为根的子树。树是数据结构中一种常见的数据结构,比如我们排序中常见的二叉树,红黑树等。最常见的是树形表示法和广义表表示法。树的结构示意图如下所示: 二叉树二叉树是一种特殊的顺序树,它有左右两个孩子子树,即左右孩子顺序原创 2017-02-14 21:06:05 · 2981 阅读 · 0 评论 -
红黑树深入剖析及Java实现
概述红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。二叉查找树(BST)二叉查找树(Bina原创 2017-02-14 22:40:09 · 5069 阅读 · 6 评论 -
图算法之bfs、dfs、prim、Dijkstra
# 概述 在图算法中经常要执行遍历每个顶点和每条边的操作,即图搜索。许多图算法都以图搜索为基础,如2-着色问题、连通性计算基于深度优先搜寻(depth-first search, DFS),而无权最短路径则基于广度优先搜索(breadth-first search, BFS)。基于搜索的算法还包括计算最小生成树的Prim算法以及计算最短路径的Dijkstra算法。图实现算法在现实的算法结构中占据重原创 2017-04-07 18:05:25 · 4133 阅读 · 0 评论 -
归并排序算法的编码和优化
在大型公司的面试过程中,排序是必问的知识。本篇内容来自《算法(第4版)》 — — Robert Sedgewick, Kevin Wayne概念归并排序的实现我是这样来描述的:先对少数几个元素通过两两合并的方式进行排序,形成一个长度稍大一些的有序序列。然后在此基础上,对两个长度稍大一些的有序序列再进行两两合并,形成一个长度更大的有序序列,有序序列的的长度不断增长,直到覆盖整个数组的大小为止,归并排序原创 2017-12-02 10:39:21 · 1571 阅读 · 0 评论 -
前缀、中缀、后缀表达式
在函数式编程语言中,为了表示方便,出现了一些新的语法格式。所谓前缀、中缀、后缀表达式,它们之间的区别在于运算符相对与操作数的位置不同,为了说明它们的概念,首先来看一下中缀表达式。所谓中缀表达式,就是将函数名放到两个操作数中间的表达式,其中,左侧的操作数代表函数对象或值,右侧的操作数代表函数的参数值。例如:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4原创 2018-01-03 10:05:52 · 1840 阅读 · 0 评论 -
数据结构之链表
一、概念(1)数组的线性序是由数组的下标决定的,链表中的顺序是由各对象中的指针所决定的(2)链表结点结构node *prev;node *next;int key;(3)链表结点node *head;node *nil;//哨兵(4)对链表的操作LIST-SEARCH(L, k)LIST-INSERT(L, x)LIST-DELETE(L, x)原创 2016-06-05 13:46:07 · 5319 阅读 · 2 评论 -
数据结构之2-3-4树
2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构,可以在O(lgn)的时间内查找、插入和删除,这里的n是树中元素的数目。2-3-4树和红黑树是等价的,也就是每个红黑树都可以转化为一颗2-3-4树,每个选择操作也和2-3-4树中的分裂操作对应。 2-3-4树是这样一种数据结构,满足如下性质: 1) 每个节点每个节点有1、2或3个key,分别称为2-node原创 2016-06-05 23:47:36 · 6640 阅读 · 1 评论 -
算法之红黑树
红黑树(一) 原理和算法详细介 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 [注意:这里原创 2016-06-05 12:54:48 · 17977 阅读 · 2 评论 -
基本数据结构概念
一、线性结构顺序存储线性表:将元素依次存储在地址连续的存储单元中,物理上相邻;链式存储线性表:将元素按照逻辑顺序链接在依次,不要求地址连续;栈:仅在表的一端进行插入、删除操作的线性表,“后进先出”;队列:仅在表的一端进行插入,另一端进行删除的线性表,“先进先出”栈和队列有时候笔试会针对”FIFO“这些特性出问题,不过一般理解了,就比较简单。原创 2016-05-24 15:11:42 · 2204 阅读 · 1 评论 -
数据结构之堆和栈
内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈原创 2016-06-07 15:14:29 · 1468 阅读 · 1 评论 -
算法之冒泡排序
冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。冒泡排序的图解是:总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n-1趟,第i趟,需要比较n-i次。BubbleSort.Java[java]原创 2016-06-05 13:48:40 · 8374 阅读 · 0 评论 -
算法之插入排序
插入排序算法介绍排序算法是最简单的算法,也是最基本的算法。顾名思义,插入排序就是把当前待排序的元素插入到一个已经排好序的列表里面。 一个非常形象的例子就是右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。插入排序的最坏运行时间是O(n2), 所以并不是最优的排序算法。特点是简单,不需要额外的存储空间,在元素少的时候工作得好。插入排序算法Java实现Java里面有很多数据类型原创 2016-06-05 19:10:35 · 2298 阅读 · 0 评论 -
数据结构之数组
一.数组的基本概念数组可以看成是多个相同类型数据组合,对这些数据的统一管理。数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组的元素可以是任何数据类型,包括基本类型和引用类型。C和C++中的数组都可以分配在栈上面,而JAVA中的数组是只能分配在堆上面的,因为JAVA中的数组是引用类型。二.一维数组一维数组的声明方式有2种:格式一:原创 2016-06-06 00:03:23 · 4551 阅读 · 0 评论 -
数据结构之二叉树
二叉树的定义:二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。 这个定义原创 2016-06-06 09:46:36 · 1483 阅读 · 0 评论 -
数据结构是哈希表(hashTable)
哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构。也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度。这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表。比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize。 哈希化之原创 2016-06-06 21:34:02 · 5639 阅读 · 1 评论 -
数据结构之栈和队列
我们知道,在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。众所周知,栈是先进后出,只能访问栈顶的数据,队列是先进先出,只能访问头部数据。这里不再赘述。 栈的主要机制可以用数组来实现,也可以用链表来实现,下面用数组来实现栈的基本操作:原创 2016-06-12 21:00:21 · 1497 阅读 · 1 评论 -
Map排序
Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。按键排序(sort by key)jdk内置的Java.util包下的TreeMap既可满足此类需求,原理很简单,其重载的构造器之一有一个参数,该参数接受一个比较器,比较器定义比较规则,比较规则就是作用于Tr原创 2016-06-13 22:10:02 · 2453 阅读 · 1 评论 -
算法笔记之排序
最近在看《算法笔记》,如果单从算法来说,这本书真正做到了短小精悍,首先以排序入题,那么我们今天也来说说排序。排序将一堆杂乱无章的元素按照某种规则有序排列的过程就叫“排序”.排序是一种非常基础的算法,有着广泛的理论和实践基础。对一个排序算法来说,一般从如下3个方面衡量算法的优劣:时间复杂度:主要是分析关键字的比较次数和记录的移动次数。空间复杂度:分析排序算法中需要多少辅助内存稳定性:若两个记录A和B原创 2016-11-15 20:51:15 · 4637 阅读 · 1 评论 -
数据结构之串
基本概念串(string)是由零个或多个字符组成的有限序列,又名叫字符串。形如s="a,b,c.."。ai(1 ≤ i ≤ n)可以是字母、数字或其他字符,i就是该字符在串中位置。串中的字符数目n称为串的长度,定义中谈到“有限”是指长度n是一个有限的数值。两个字符的串称为空串(null string),它的长度为零,可以直接用双引号“”表示。所谓序列,说明串的相邻字符之间具有前驱后继的关系。空格串原创 2016-12-10 18:43:13 · 2697 阅读 · 0 评论 -
常用的排序算法和时间复杂度
1. 数据结构部分数据结构中常用的操作的效率表通用数据结构查找 插入 删除遍历 数组O(N)O(1)O(N)—有序数组O(logN)原创 2016-05-31 17:53:42 · 7610 阅读 · 0 评论 -
KMP算法
KMP为的是解决2字符串匹配问题的算法,检查一个字符串是否为另一个的子串,sub = "abc" , str = "aabcd" ,str里包含了一个sub,KMP算法可以以O(M+N)的复杂度找到子串在str的位置。那代码怎么实现呢:原创 2016-04-07 15:12:17 · 1375 阅读 · 0 评论