算法与数据结构

数据结构之B+树

匿名 (未验证) 提交于 2019-12-02 22:56:40
title: 数据结构之B+树 date: 2018-11-04 20:39:00 tags: 数据结构与算法之美 一棵m阶B-树,或者是空树,或者是满足以下性质的m叉树 根结点至少有两个分支; 除根以外的非叶结点,每个结点包含分支数范围[[m/2],m],即关键字字数的范围是[[m/2]-1,m-1],其中[m/2]表示取大于等于m/2的最小整数 所有叶子结点都在树的同一层上,并且指针域为空; 所有的非终端结点应包含如下信息: (n,A0,K1,A1,K2,A2,… ,Kn,An),结点内关键字互不相等,且从小到大排列。 解释: m阶的意思是这颗树最多的分支是多少,每个节点可以包含很多关键字,范围是[[m/2]-1,m-1],比如m为 3,就说明是3阶的B-树, 那么它的树的节点的关键字最少2,最多4个。下面的B+树也是同样的理解。 设关键字的总数为 N ,求 m阶 B- 树的最大层次 L。 在实际的文件系统中,基本上不使用B_树,而是使用B_树的一种变体,称为m阶B+树。 它与B-树的主要不同是叶子结点中存储记录。在B+树中,所有的非叶子结点可以看成是索引,而其中的关键字是作为“分界关键 字”,用来界定某一关键字的记录所在的子树。一棵m阶B+树与m阶B-树的主要差异是: 1.若一个结点有n棵子树,则必含有n个关键字; 2

大话数据结构笔记-第二章 算法

风格不统一 提交于 2019-12-02 22:17:19
一、笔记 2.1 算法   算法是描述解决问题的方法。   算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。   指令能被人或者机器等计算装置执行。可以是计算机指令,也可以是我们平时的语言文字。   为了解决某个或者某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定 的功能,这就是算法。 数据结构与算法关系   学习数据结构中,谈到算法,也是为了帮助理解好数据结构。 2.2 算法的特性   算法的5个特性:输入、输出、有穷性、确定性和可行性。   算法的输入可以是零个。但算法至少有一个或多个输出。输出形式可以是打印输出或返回一个或多个值等。   有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。   确定性:算法的每一步骤都具有确定的含义,不会出现二义性。   可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。意味着算法可以转换为程序上机运行,并得到正确的结果。 2.3 算法设计的要求   算法设计的要求:正确性、可读性、健壮性、时间效率高和存储量低。 正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理五歧义性、能正确反映问题的需求、能够得到问题的正确答案。     正确性大体分为以下四个层次:    

用Python实现数据结构之树

匿名 (未验证) 提交于 2019-12-02 22:11:45
树 树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。 相关概念 根节点:树中最顶部的元素 父节点:处了根节点都有父节点,每个节点最多只有一个父节点 孩子节点:一个父节点具有0个或多个孩子节点 兄弟节点:同一个父节点的孩子节点之间是兄弟关系 外部节点:一个没有孩子的节点称为外部节点,也叫叶子结点 内部节点:有一个或多个孩子节点的节点叫做内部节点 树的边:指一对节点(u,v),其中u是v的父节点或者v是u的父节点 树的路径:一系列连续的边组成了一条路径 节点的深度:节点的深度就是该节点的祖先的个数,不包括该节点本身,如果根节点的层数为1,则深度即为该节点的层数-1 节点的高度:如果p是树中的叶子节点,那么它的高度为0.否则p的高度是它的孩子节点中的最大高度+1 有序树:每个孩子之间有一定的顺序,例如: 一个树的抽象基类 class Tree(): """ 树的抽象基类 """ # 叫做位置的内嵌类,用于封装节点 class Position(): def element(self): raise NotImplementedError('must be implemented by

《Java数据结构和算法》- 链表

匿名 (未验证) 提交于 2019-12-02 21:53:52
Q: 为什么要引入链表的概念?它是解决什么问题的? 数组作为数据存储结构有一定的缺陷,在无序数组中,搜索是低效的;而在有序数组中,插入效率又很低;不管在哪一个数组中删除效率都很低;况且一个数组创建后,它的大小是不可改变的。 在本篇中,我们将学习一种新的数据结构 ―― 链表,它可以解决上面的一些问题,链表可能是继数组之后第二种使用最广泛的通用存储结构了。 Q: 结点? 定义单链表结点的类定义如下: class Entry<E> { E mElement; Entry<E> mNext; public Entry(E element, Entry<E> next) { mElement = element; mNext = next; } } Q: 单链表? 构成链表的结点只有一个指向后继结点的指针域。 Q: 单链表的Java实现? 示例: SingleLinkedList.java LinkedList类只包含一个数据项mHeader,叫做表头:即对链表中第一个节点的引用。它是唯一的链表需要维护的永久信息,用以定位所有其他的链接点。从mHeader出发,沿着链表通过每个结点的mNext字段,就可以找到其他的结点。 注意,removeFirst()方法假定链表不是空的,因此调用它之前,应该首先调用empty()方法核实这一点。 Q: 如何查找和删除指定的结点? indexOf

对前端数据结构与算法的研究----------------引用

隐身守侯 提交于 2019-12-02 18:18:25
1. 递归 递归就是自己调自己,递归在前端里面算是一种比较常用的算法。假设现在有一堆数据要处理,要实现上一次请求完成了,才能去调下一个请求。一个是可以用Promise,就像《前端与SQL》这篇文章里面提到的。但是有时候并不想引入Promise,能简单处理先简单处理。这个时候就可以用递归,如下代码所示: var ids = [34112, 98325, 68125]; ( function sendRequest ( ) { var id = ids . shift ( ) ; if (id ) { $ . ajax ( {url : "/get" , data : {id } } ) . always ( function ( ) { //do sth. console . log ( "finished" ) ; sendRequest ( ) ; } ) ; } else { console . log ( "finished" ) ; } } ) ( ) ; 上面代码定义了一个sendRequest的函数,在请求完成之后再调一下自己。每次调之前先取一个数据,如果数组已经为空,则说明处理完了。这样就用简单的方式实现了串行请求不堵塞的功能。 再来讲另外一个场景:DOM树。 由于DOM是一棵树,而树的定义本身就是用的递归定义,所以用递归的方法处理树,会非常地简单自然

数据结构与算法学习大纲

限于喜欢 提交于 2019-12-02 18:17:11
  [TOC]      学习一门语言就练练下面的数据结构和算法.      01链表      1. 链表的必备知识要点(包括基础知识、刷题中使用的STL等知识)      2. 链表逆序(LeetCode 92,206. Reverse Linked List 1,2)      3. 求两个链表的交点(LeetCode 160. Intersection of Two Linked Lists)      4. 链表的节点交换(LeetCode 24. Swap Nodes in Pairs)      5. 链表求环(LeetCode 141,142. Linked List Cycle 1,2)      6. 链表重新构造(LeetCode 86. Partition List)      7. 复杂的链表复制(LeetCode 138. Copy List with Random Pointer)      8. 排序链表合并(2个与多个) (LeetCode 21,23 Merge Two(k) Sorted ListsLeetCode)      02栈、队列、堆      1. 栈、队列知识要点与实现(数组、链表)      2. 使用队列实现栈(LeetCode 232. Implement Queue using Stacks)      3.

数据结构笔记1(c++)_指针

匆匆过客 提交于 2019-12-02 12:59:35
一、数据结构概述 1.定义:     我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作。这个相应的操作也叫算法。   数据结构 =个体 + 个体的关系   算法(狭义) = 对存储数据的操作   2.算法:解题的方法和步骤   2.1.衡量算法好坏的标准:       2.1.1.时间复杂度: 程序 大概 执行的次数,而非执行的时间       2.1.2.空间复杂度: 算法执行过程中大概所占用的最大内存       2.1.3.难易程度(编算法最重要的)       2.1.4.健壮性 3.数据结构的地位:数据结构是软件中最核心的课程    程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 二、预备知识   1.指针     1.1.指针的重要性:指针是c语言的灵魂     1.2.有关指针概念的定义:       指针就是地址 地址就是指针,指针和地址是一个概念       指针变量 是存放内存单元地址的变量, 所谓内存单元地址 即为内存单元编号,两者是一个概念       指针的本质 是一个操作受限的非负整数/从0开始的非负整数                    范围:0 -- FFFFFFFF【4G-1】     

Python数据结构和算法(五)------树与树算法

岁酱吖の 提交于 2019-12-02 12:44:33
树与树算法 目录 树与树算法 一、关于树的一些概念 1.树的定义 2.树的术语 3.树的分类 4.树的存储与表示 二、二叉树 1.基本概念 2.基本性质 3.二叉树的存储 4.二叉树的节点创建和广度遍历 5.二叉树的深度遍历 6.由遍历结果确定一棵二叉树 一、关于树的一些概念 1.树的定义 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 2.树的术语 节点的度 :一个节点含有的子树的个数称为该节点的度; 树的度 :一棵树中,最大的节点的度称为树的度; 叶节点或终端节点 :度为零的节点; 父亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度 :树中节点的最大层次; 堂兄弟节点

Python数据结构二叉树及其广度优先搜索

戏子无情 提交于 2019-12-02 11:15:26
前言   关于Python编程,很多人说,Python实现不了数据结构,Python没有指针。其实,说过那句的人更应该好好学习Python。仔细阅读本文之后,读者能够使用Python实现基本的数据结构。   以下列二叉树为例   在使用二叉树的过程中,我们又常使用一些算法完成对树的遍历,比如广度优先搜索算法。 算法过程: 1.将根节点放入队列中 2.从队列中取出第一个元素,将队列中的第一个元素弹出 3.将所取得元素的全部节点加入队列中 4.判断队列是否为空 a. 若是,则结束 b.若不是,则跳到第二步   了解了二叉树和广度优先搜索算法,那么我们用Python来实现他们吧 #结点类 class Node ( ) : def __init__ ( self , data = None ) : self . data = data self . left = None self . right = None #二叉树 class Tree ( ) : def __init__ ( self ) : self . root = Node ( ) def add ( self , data ) : # 为树加入节点 node = Node ( data ) if self . root . data == None : # 如果树为空,就对根节点赋值 self . root = node