查找算法

BST and Heap详解

和自甴很熟 提交于 2019-12-05 12:19:30
BST(Binary Search Tree) 基本特点: 二叉树 集合中的数据具有可比较大小的关键码 数据之间满足BST特性 中序遍历可得到一个递增的数据序列(可作为判断一棵二叉树是否是BST的方法) 同一个数据集合,可存在多个不同形态的BST树 基本操作 问题描述+求解动机+算法思想+算法步骤+性能分析 进行操作,都需要: 先找到要操作的数(位置),进行操作,保证BST的特性,保障优的算法性能。 查找(logn) 插入(logn ~ n) 若给定值 小于 根结点的关键字,则继续 在 左 子树上进行查找 若给定值 小于 根结点的关键字,则继续在 左 子树上进行插入; 将返回值(结点指针)设置为(当前)根结点的左孩子 若给定值 大于 根结点的关键字,则继续 在 右 子树上进行查找 若给定值 大于 根结点的关键字,则继续在 右 子树上进行插入; 将返回值(结点指针)设置为(当前)根结点的右孩子 若给定值等于根结点的关键字,则查找 成功 /   删除操作:   从最简单的情况开始—— 删除最小值 ; 由BST特性可知,BST中最小值一定在左子树的最左边取到,于是去get到它。 BST删除最小值算法思想(非递归) 1)定义一个指向BST树结点的临时指针变量p和pp。 2)从BST的根结点开始;将其值赋值给p。 3)若p的左孩子不等于空指针,将p的值赋值给pp;然后

《信息安全系统设计基础》第八周学习总结

喜夏-厌秋 提交于 2019-12-05 12:05:20
《信息安全系统设计基础》第八周学习总结(ch09) 教材学习内容 本章学习了面对对象的设计方法有四个阶段,分别是集体讨论、过滤、场景、责任算法。对翻译过程有详细的了解,知道了编译器和解释器运行的基本原理。对于程序设计语言的范型,明白了什么是范型以及两种主要范型——命令式范型和声明式范型。 教材学习中的问题和解决过程 对当前世界top50的编程语言进行范型的分类 解决方法:查找书本上出现的编程语言的类别,其他语言则通过百度查找后通过概念进行判断。 来源: https://www.cnblogs.com/daijunxi2019/p/11922917.html

2019-2020-1 20175314 《信息安全系统设计基础》第9周学习总结

╄→尐↘猪︶ㄣ 提交于 2019-12-05 11:43:14
2019-2020-1 20175314 《信息安全系统设计基础》第9周学习总结 本周学习内容总结 虚拟存储器的概念和作用 虚拟存储器的概念: 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。 虚拟存储器的作用: 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Window 虚拟存储器s中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内存里储存的文件释放到原来的安装目录里了。 总结起来说:虚拟存储器简化了链接、简化了加载、简化共享和简化存储器分配。 地址翻译的概念 IP地址耗尽促成了CIDR的开发

哈希表(hash)详解

为君一笑 提交于 2019-12-05 05:28:44
哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置 = function(关键字) 这里的对应关系function称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数function既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行 取余 ,取余结果就当作数组的 下标 ,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出 ,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。) 而当使用哈希表进行 查询的时候,就是再次使用哈希函数将key转换为对应的数组下标【仍通过映射哈希函数function】

数据结构与算法

僤鯓⒐⒋嵵緔 提交于 2019-12-05 04:38:44
数据结构与算法 1. 概述 什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已。所谓的计算机科学实际上是对问题、解决问题以及解决问题的过程中产生产生的解决方案的研究。例如给定一个问题,计算机科学家的目标是开发一个算法来处理该问题,最终得到该问题的解、或者最优解。所以说计算机科学也可以被认为是对算法的研究。因此我们也可以感受到,所谓的算法就是对问题进行处理且求解的一种实现思路或者思想。 什么是算法? 问题,解决问题,解决问题过程中产生的解决方案,算法就是对问题进行处理且求解的一种实现思路或者思想 评判程序优劣的方法? 时间复杂度: 评判规则: 量化算法执行的操作/执行步骤的数量 最重要的项: 时间复杂度表达式中最有意义的项 例如: def sumOfN(n): theSum = 0 # 1 for i in range(1, n + 1): theSum = theSum + i # n return theSum print(sumOfN(10)) # 此算法的时间复杂度位O(n) 分析算法时间复杂度的步骤: 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中,只保留最高阶项。 如果最高阶项存在且不是1,则去除与这个项相乘的常数。 得到的最后结果就是大O阶。

数组与链表

为君一笑 提交于 2019-12-05 03:53:24
前言 数组和链表是两种数据结构,数组非常简单易用但是它有两个非常大的缺点,一个是数组一旦创建无法扩展,另一个则是数组的查找和删除的速度很慢. 链表改善了一些数组的缺点,但是同样的链表自身也存在一些自己的缺点. 本篇博客将为大家介绍一下这数组和链表特点及各自的优缺点. 阅读前的准备工作 大O表示法 ,一种粗略的评价计算机算法效率的方法.后面的内容会用到表示效率的方法. 1. 数组 我们按数组中的数组是否排序对数组进行划分,将数组分为无序数组和有序数组.无序数组中的数组是无序的,而有序数组中的数据则是升序或者降序排序的. 1.1 无序数组 因为无序数组中的数据是无序的,往数组中添加数据时不用进行比较和移动数据,所以往无序数组里面添加数据很快.无论是添加第一个数据还是第一万个数据所需的时间是相同的,效率为O(1). 至于查找和删除速度就没有那么快了,以数组中有一万个数据项为例,最少需要比较1次,最多则需要比较一万次,平均下来需要比较5000次,即N/2次比较,N代表数据量,大O表示法中常数可以忽略,所以效率为O(N). 结论: 插入很快,因为总是将数据插入到数组的空余位置. 查找和删除很慢,假设数组的长度为N,那么平均的查找/删除的比较次数为N/2,并且还需要移动数据. 1.2 有序数组 无序数组中存放的数据是无序的,有序数组里面存放的数据则是有序的(有可能是升序有可能是降序).

关于如何查找和搜索所有的绑架和逮捕集团的人员的算法和数据结构设计简要说明

寵の児 提交于 2019-12-05 03:48:51
这个计划代号 女王陛下 v0.1 拨款 1000元 你来完成啊。。帅哥 关于如何精确的查询专业的逮捕和绑架集团的人的算法和数据结构设计 基本特征分析:这些人的心脏是一种专门制造来抓人的心脏,除了心脏以外 其它器官和功能都和土著自然人一样,甚至显得还优雅一些 这种人造人的特征值:它们所做的任何事情和说的任何语言 写的任何文章的目的都是为了抓人,这些行为,语言和文章 都只是掩盖 比如说:有一个你的同学,打电话让你去开会。。。找了无数的理由。。。。 然后你没有去。。这位同学开始绕开你本人的拒绝,找到你的上级 使用各种方法让你的上级给你打电话,让你去开会。。。 类似这种情况的各种战棋推演模型,都可以加入到这个架构中 为了彻底消灭这种生物及其它们的生态系统,地球上面所有的渴望自由与无政府主义 和幻想精神的人们和系统都必须使用最高级的编程语言和算法来完成这个设计 这个伪装的文艺,教育,政治,科技,IT的垃圾堆,其核心是一个非常黑暗和恐怖的一颗心 来源: https://www.cnblogs.com/comsci/p/11903552.html

基础算法之查找数组中第二小的元素

最后都变了- 提交于 2019-12-05 03:13:56
找到数组中,第二小的元素 // C program to find smallest and second smallest elements #include <stdio.h> #include <limits.h> /* For INT_MAX */ void print2Smallest(int arr[], int arr_size) { int i, first, second; /* There should be atleast two elements */ if (arr_size < 2) { printf(" Invalid Input "); return; } first = second = INT_MAX; for (i = 0; i < arr_size ; i ++) { /* If current element is smaller than first then update both first and second */ if (arr[i] < first) { second = first; first = arr[i]; } /* If arr[i] is in between first and second then update second */ else if (arr[i] < second && arr[i] !=

MySQL架构

帅比萌擦擦* 提交于 2019-12-05 03:01:41
一、MySQL架构 第一层,即最上一层 ,所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。 第二层值得关注 。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。 第三层包括了存储引擎 。通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事 物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求。 连接管理和安全 在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中。服务器缓存了线程

20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

大城市里の小女人 提交于 2019-12-05 00:31:50
20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 第十六章 树 树 1.树是非线性结构,其元素组织为一个层次结构 2.树的度表示树中的任意结点的最大子结点数 3.有m个元素的平衡n叉树的高度是lognm 4.树的遍历有4种方法 5.进行层序遍历时可采用队列来储存树中的元素 6.使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置 7.树的基于数组的存储链实现方式可以占数组中的连续位置,不管树是不是完全树 8.如何在一般二叉树中添加及删除元素,要取决于树的用途 9.使用决策树可以设计专家系统 二叉树 1.二叉查找树时一颗二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,二右子树上的元素大于等于父结点的值 2.如果没有其他的操作,二叉查找树的树形由元素的添加次序来决定 3.最有效地二叉查找树时平衡的,所以每次比较时可以排除一半的元素 4.当从二叉查找树中删除元素时要考虑三种情形,其中的两种比较简单 5.当从二叉查找树中删除有两个子结点的结点时,比较好的办法是用它的中序后继来取代它 6.可以对二叉查找树进行旋转以恢复平衡 部分计算公式 1.二叉树上第i层上的结点数目最多为2^(i-1)(i>=1) 2.深度为k的二叉树至多有2^k-1个结点(i>=1) 3