算法与数据结构

数据结构的基本实现

删除回忆录丶 提交于 2020-01-28 18:57:34
1. python中内置计算算法效率的类 class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=) Timer是测量小段代码执行速度的类。 stmt参数是要测试的代码语句(statment); setup参数是运行代码时需要的设置; timer参数是一个定时器函数,与平台有关。 timeit.Timer.timeit(number=1000000) def test1 ( ) : l = [ ] for i in range ( 1000 ) : l = l + [ i ] def test2 ( ) : l = [ ] for i in range ( 1000 ) : l . append ( i ) def test3 ( ) : l = [ i for i in range ( 1000 ) ] def test4 ( ) : l = list ( range ( 1000 ) ) from timeit import Timer t1 = Timer ( "test1()" , "from __main__ import test1" ) print ( "concat " , t1 . timeit ( number = 1000 ) , "seconds" ) t2 = Timer ( "test2()" ,

相关知识点——数据结构、排序算法和查找算法

耗尽温柔 提交于 2020-01-28 16:03:04
文章目录 相关知识点——数据结构、排序算法和查找算法 数据结构 列表 栈 队列 链表 字典 散列 图 二叉树和二叉查找树 排序算法 基本排序算法 冒泡排序 选择排序 插入排序 高级排序算法 希尔排序 归并排序 快速排序 查找算法 顺序查找 二分查找 相关知识点——数据结构、排序算法和查找算法 相关讲解细分: 数据结构:列表、栈、队列、链表、字典、散列、图和二叉查找树 排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序 查找算法:顺序查找和二分查找 数据结构 列表 在日常生活中,人们经常使用列表:待办事项列表、购物清单、最佳十名榜单等等。而计算机程序也在使用列表,在下面的条件下,选择列表作为数据结构就显得尤为有用: 数据结构较为简单 不需要在一个长序列中查找元素,或者对其进行排序 反之,如果数据结构非常复杂,列表的作用就没有那么大了。 栈 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。想象一下,我们平常在饭馆见到的一摞盘子就是现实世界常见的栈的例子,只能从最上面取盘子,盘子洗干净后,也只能放在最上面。栈被称为一种后入先出的数据结构。是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快。 使用条件: 只要数据的保存满足后入先出或先进后出的原理,都优先考虑使用栈. 队列 队列也是一种列表,不同的是队列只能在队尾插入元素

【数据结构与算法】二叉树的遍历

让人想犯罪 __ 提交于 2020-01-28 09:52:48
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。 层次遍历是指,对树中的节点一层一层的打印,其实就是广度优先算法(BFS)。 一、前序遍历 LeetCode: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ C语言代码实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 11 /** 12 * Note: The returned array must be malloced, assume caller calls free(). 13 */ 14 15 /* 获取树的节点个数 */ 16 int getTreeNodeLen(struct TreeNode* root) 17 { 18 if (root

《码渣的进阶》——数据结构

陌路散爱 提交于 2020-01-28 07:00:59
常见面试题 1。什么是平衡二叉树? 插入数据? 2。解决hash冲突的办法? 3。阻塞队列,生产者消费者模型。 4。B-树,B+树的区别(时间复杂度) 5。二叉树与堆的关系?(时间复杂度) 树 1。二叉树的定义: 每个节点最多只有两颗子树,并且有左右子树之分。 每一层节点达到最大就是满二叉树。 每一层节点序号和满二叉树对应,为完全二叉树(满二叉树从后向前删减可变成完全二叉树) 2。遍历二叉树:(先中后代表root点的顺序,左右子树的先后是确定的) 先序遍历:root-左-右 中序遍历:左-root-右 后序遍历:左-右-root 线索二叉树就是通过遍历二叉树的顺序,在左指针加上前驱,右指针加上后继。 3。深林变二叉树: 所有节点,最左子树不变,其余节点全部断开,依次变为左兄弟节点的右节点。 4。最优二叉树(哈夫曼树): 权值越小的节点离根最远,才可以达到二叉树的总路径长度最小。 5。二叉排序树(二叉查找树): 所有节点,左子树的所有节点的值都小于根节点的值,所有右子树节点的值都大于根节点的值。 所以,中序遍历可以达到有序序列。 查找的时间复杂度:O(log2n) 递归查找算法: 6。平衡二叉树: 树中任何一个节点的左右两颗子树的高度差的绝对值不能大于1。 左右旋使之保持为平衡二叉树: 左边多,并且添加节点在左节点(的任一边):直接右旋 右边多,并且添加节点在右节点(的任一边)

数据结构_第八章_排序

两盒软妹~` 提交于 2020-01-28 04:08:36
第八章 排序 8.1排序的基本概念 8.2插入排序 8.3交换排序 8.4选择排序 8.5归并排序 8.6分配排序 8.1排序的基本概念 排序:给定一组记录的集合{r1, r2, ……, rn},其相应的关键码分别为{k1, k2, ……, kn},排序是将这些记录排列成顺序为{rs1, rs2, ……, rsn}的一个序列,使得相应的关键码满足ks1≤ks2≤……≤ksn(称为升序)或ks1≥ks2≥……≥ksn(称为降序)。 正序:待排序序列中的记录已按关键码排好序。 逆序(反序):待排序序列中记录的排列顺序与排好序的顺序正好相反。 趟:在排序过程中,将待排序的记录序列扫描一遍称为一趟。 通常,一次排序过程需要进行多趟扫描才能完成 排序的分类-根据排序数据在内存中还是在外存中: 1.内排序:在排序的整个过程中,待排序的所有记录全部被放置在内存中 2. 外排序:由于待排序的记录个数太多,不能同时放置在内存,而需要将一部分记录放置在内存,另一部分记录放置在外存上,整个排序过程需要在内外存之间多次交换数据才能得到排序的结果。 排序的分类-根据排序过程中所进行的基本操作分: 基于比较:基本操作——关键码的比较和记录的移动,其最差时间下限已经被证明为O(nlog2n)。 不基于比较:根据关键码的分布特征。比如,桶式排序,基数排序(多关键字排序) 1.时间复杂性:基本操作。

数据结构与算法概要

廉价感情. 提交于 2020-01-27 22:25:34
数据结构 + 算法 = 程序 数据结构 就是关系(数据元素相互之间存在一种或多种特定关系的集合),包括:   1.逻辑结构       集合结构: 元素同属一个集合,但无关联。      线性结构: 元素之间是一对一的关系,连成线,每个元素是一个节点。      树形结构: 一对多的层次关系。      图形结构: 多对多。   2.物理结构   定义:研究如何把数据元素(后简称元素)存储到计算机的存储器中。   存储器是主要 针对内存 而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用 文件结构 来描述。   元素的存储形式有两种: 顺序存储 和 链式存储 。     顺序存储结构:元素存放在地址连续的存储单元,数据间的逻辑关系和物理关系一致。     链式存储结构:元素存放在任意的存储单元,不一定连续,不能反映逻辑关系,需要用一个指针存放元素地址,通过地址找元素位置。 算法 五个基本特性: 输入 、 输出 、 有穷性 、 确定性 和 可行性 。(有没有输入都可以,但必须有输出;无二义; 每步都可实现)  另:操作系统普遍存在缓冲区溢出现象 要求: 正确性 (1.无语法错误;2.合法输入可产生满足要求的输出;3.非法输入可产生满足规格的说明;4.故意刁难的测试输入有满足要求的输出结果)、 可读性  、 健壮性 、 时间效率高和存储量低 。   来源: https://www

《一文说透数据结构》系列之什么是堆?看这一篇就够了

故事扮演 提交于 2020-01-26 19:23:14
本文将首先介绍什么是堆,然后介绍了堆的插入和删除操作,最后给出了堆的代码实现,并进行了测试。 什么是堆 堆是一颗完全二叉树,堆中某个节点的值总是不大于或不小于其父节点的值。根节点最大的堆叫做大根堆,根节点最小的堆叫做小根堆。 首先解释下什么是完全二叉树,设一颗二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。如下图所示,左侧的二叉树满足完全二叉树的定义,而右侧的不满足。 上图左侧便是一个小根堆,满足任意一个节点的值总是不小于其父节点的值。 堆的表示 一般的二叉树表示时需要首先定义节点结构,节点中包含指向父节点的指针,如下所示: class Node<E>{ E e;//节点储存的值 Node left,right;//左右子节点 public Node(E e){ this.e = e; this.left = this.right = null; } } 但是堆并不是像树一样存储,其中没有使用父指针或者子指针,而是用数组来实现。怎么用数组来实现呢?先看一张图,如下: 我们从0开始对节点进行编号,寻找其中父子节点之间索引的对应关系。 首先,通过子节点的索引来找父节点的索引,设子节点的索引为i,则其父节点的索引为 int parentIndex = (i - 1) / 2; 然后

数据结构与算法之冒泡排序

落花浮王杯 提交于 2020-01-26 14:51:23
一、概念 冒泡排序(Bubble Sorting):通过对待排序序列从前往后,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素主键从前移向后部,就像水底下冒泡一样逐渐往上冒。 通俗来讲就是:相邻元素对比,左边比右边大的话就换个位置,每轮对比下来就能确定一个最大值,第一轮最大值在最后位置,第二轮倒数第二大的值在倒数第二个位置上,以此类推,也就是需要对比的次数为数组长度-1,因为每次对比都能确定一个最大值,且放到最后。 二、图解 比如要冒泡如下数组:[3, 9, -1, 10, -2] 第一趟排序: [3,-1,9,-2,10] 第二趟排序: [-1,3,-2,9,10] 第三趟排序: [-1,-2,3,9,10] 第四趟排序: [-2,-1,3,9,10] 三、coding 1、lowb演示版 package com . chentongwei . struct . sort ; import java . util . Arrays ; /** * Description: * * @author TongWei.Chen 2019-12-30 17:18:26 */ public class BubbleSort { public static void main ( String [ ] args ) { int [ ] arr = { 3 , 9 , - 1 , 10

_数据结构_快速排序

旧时模样 提交于 2020-01-26 14:36:02
快速排序是一种二叉树结构的交换排序算法     其基本思想是在序列中找一个元素作为基准值,将排序集合分割为两个子序列,左子序列中的所有元素都小于基准值,右子序列中的所有元素均大于基准值,再将左右子树重复此操作,知道所有元素都排列在相应位置 源代码获取: https://github.com/akh5/C-/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%8E%92%E5%BA%8F/quicksort.c 讨论前后指针法 序列中分别在前后定义两个指针,将一开始开头指针指向的值作为基准值,后指针开始向前遍历,遍历到比基准值小的值时,当前位置的值与基准值交换,前指针开始向后遍历,遇到比基准值大的值时,当前位置与基准值交换,,换前指针向前遍历,反复交替,直到前指针与后指针交叉。 此时将序列分为左右两个子树,基准值为根,左子树均小于基准值,右子树均大于基准值 # include <stdio.h> void Swap ( int * a , int * b ) //交换的函数 { int temp ; temp = * a ; * a = * b ; * b = temp ; } void dealsort ( int * arr , int start , int end ) { if ( start >= end ) {

孪生素数(数据结构与算法)(python)

泄露秘密 提交于 2020-01-26 11:09:25
利用判断素数的函数,编写程序找出1-100之间所有的孪生素数(若两个素数之差为2,这两个素数就是一对孪生素数)。例如:3和5,5和7,11和13等都是孪生素数。(python) def Prime(n): if n<2: return False elif n==2: return True else: i=2 for i in range(2,n): if n%i==0: break else: i=i+1 if i==n: return True else: return False for i in range(1,100): if Prime(i)==True and Prime(i+2)==True: print ( i,i+2,"是孪生素数") 来源: CSDN 作者: LY_dreams 链接: https://blog.csdn.net/MengJing_/article/details/103754298