数据结构/算法
文章平均质量分 62
huangshanchun
机会比实力重要,实力不够的时候,肯定会流失机会。
展开
-
有限状态自动机
状态机是由事件、状态、动作三大部分组成。三者的关系是:事件触发状态的转移,状态的转移触发后续动作的执行。其中动作不是必须的,也可以只进行状态转移,不进行任何操作。如下图所示,可以受状态机启发对营销活动状态流转进行改造。原创 2023-07-23 16:39:57 · 389 阅读 · 0 评论 -
深度优先搜索&广度优先搜索
算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的。主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。...原创 2022-08-14 16:21:11 · 2065 阅读 · 0 评论 -
leetCode实战之字典树
字典树,又称Tire、单词查找树、前缀树,是一种树形结构,也是哈希树的一种变种,主要用于同于统计和排序大量字符串(不限于字符串),所以经常被搜索引擎系统用于文本词频统计。如下图所示,用an、catch、care、cool、city几个词建立的一个字典树。字典树不会把某个单词存放到具体的节点,而是通过路径来表示具体单词,当你输入ca 系统就可以推荐出cat、catch、care相关词(实际中可能比这个可以按照相应频次)。...原创 2022-07-09 18:13:26 · 431 阅读 · 0 评论 -
LeetCode算法之拓扑排序
先看一个例子,大学排课(整理出先后依赖顺序),以计算机专业为例,如下表所示,想线上数据结构时候,必选先修C1和C2。如果课程比较少可以人肉排下,如果课程比较多,就需要借助相应工具或者算法来解决。可以使用图来描述这个问题,每一门课为顶点,如果有预修课程,则该两个顶点有一条有向边(预修课程指向后续课程),如下图所示上面排课可以抽象描述为如下。这种图叫AOV网络(Activity on Vertex),活动是表现在顶点上的,顶点之间的有向边表示两个活动的先后顺序。定义:拓扑序,如果AOV图中从V到W有一条有原创 2022-07-05 21:03:59 · 607 阅读 · 0 评论 -
LeetCode算法之队列
1 什么是队列队列是一种特殊的线性表,限定只能在线性表的一端进行插入(队尾),而在另一端进行删除操作(对头),特点是先进先出(FIFO)。双端队列是两端都可以进行插入和移除操作的队列。 Deque<Integer> queue=new ArrayDeque<>(); //添加一个元素 queue.addFirst(1); queue.addLast(1); System.out.println(queue.p原创 2022-05-02 15:36:11 · 721 阅读 · 0 评论 -
java手写二叉堆
0 堆的定义由n个元素组成的序列{k1,k2,…,kn-1,kn},当且仅当满足如下图关系时,称之为堆。原创 2022-05-02 12:28:50 · 790 阅读 · 0 评论 -
LeetCode链表-反转&有无环
1 反转链表题目:https://leetcode-cn.com/problems/reverse-linked-list/思路:把每个链表next 指向前驱节点即可,类似链表头插入法class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null) { return head; } //前一个节点,一开原创 2022-04-09 12:13:25 · 253 阅读 · 0 评论 -
LeetCode实战2-4数合
1 两数之和题目地址:https://leetcode-cn.com/problems/two-sum/思路1.:两层循序找,判断是否相等,时间复杂度O(n2),空间复杂度O(1);class Solution { public int[] twoSum(int[] nums, int target) { int len=nums.length; for(int i=0;i<len;i++) for(int j=i+1;j<l原创 2022-04-05 15:36:53 · 538 阅读 · 0 评论 -
算法基础-数组
0 数组数组(array)是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。基本特点:支持随机访问,索引与寻址。java int[] arr=new int[100];原创 2021-11-07 15:49:28 · 121 阅读 · 0 评论 -
布隆过滤器
0 什么是布隆过滤器布隆过滤器(Bloom Filter) 是由巴顿布隆于1970提出,是一种通过多个哈希函数映射来对参数存储空间进行压缩的数据结构;本质上是由一个比较长的二进制位向量和一组hash函数映射构成。 由于布隆过滤器不需要存储元素本身,节省了大量的空间,所以其在数据查重时具有很大优势。布隆过滤器的优点是空间效率和查询时间都远远超过⼀一般的算法,缺点是有一定的误识别率和删除困难,因此其不适合对误判率要求较高的场景。有研究表明如果想保持较低的误判率,布隆过滤器的使用空间应低于50%。1 布隆过原创 2021-04-03 22:39:12 · 221 阅读 · 0 评论 -
排序算法学习笔记一
0 概述如下图所示,给出了常见排序算法,本文主要总结基于比较排序算法。非比较的算法1 基于比较排序算法基于比较排序算法,常见的主要有冒泡排序、选择排序、插入排序。1.1 冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。 /** * 一次冒泡会让至少一个元素移动到它应该在的位置,所以最坏情况需要扫描n次原创 2021-03-14 15:29:02 · 147 阅读 · 0 评论 -
数据结构和算法学习-复杂度分析笔记
0 算法复杂度分析是什么数据结构和算法解决的是如何让计算机更快时间、更省空间的解决问题,算法执行效率是算法一个非常重要的考量指标。所谓的算法复杂度是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。1 为什么要做复杂度分析有的人肯定会说,可以通过性能测试就能得到算法执行的时间和占用的内存大小。性能测试依赖执行环节、数据规模等条件制约,其可操作性&成本会比较高。我们不可能也没有必要对所有算法做性能测试。因此我们需要我们需要一个不用具体的测试数据来测试,就可以粗略地估计算原创 2021-02-13 15:49:56 · 112 阅读 · 1 评论 -
数据结构和算法学习笔记
0 是什么1 学什么2 怎么学参考文献[1]极客时间数据结构与算法课程原创 2021-02-12 17:28:00 · 87 阅读 · 0 评论 -
二叉排序树实现符号表
本文将介绍能够将链表插入的灵活性和有序数组查找高性结合起来的符号表。具体来说,就是使用每个结点含有两个链接的二叉排序树(Binary Sort Tree)来高效实现符号表。原创 2017-06-21 20:25:27 · 482 阅读 · 0 评论 -
有序数组实现符号表
主要讲述使用有序数组实现符号表;由于数组是有序的,故查询的时候可以使用二分查找法,这样查询时候可以大大提高查询效率。比较适合读多写少场景,如Session会话保存与获取。原创 2017-06-17 17:18:10 · 790 阅读 · 0 评论 -
无序链表实现符号表
互联网时代能够使我们访问海量的信息,高效检索这些信息的能力就显得非常重要。使用符号表(也称为字典)这个词开描述抽象的表格,我们将会将信息的存储在其中,然后按照指定的键来搜索这些信息。原创 2017-06-14 22:22:57 · 859 阅读 · 0 评论 -
当当网数据(1.1G)快速检索
当当网泄露的数据1.1G,共有13180805条记录,在内存使用的较小的情况下实现快速检索。这里使用QT(方面做图形界面),读写文件则使用C语言的相关库函数。1.使用普通方法检索,就是一行一行的读取文件,然后再判断该行信息是否符合要求。2.根据键值建立索引文件,然后查询的时候根据输入姓名键值转换对应到相应的索引文件中去查找。一个汉字占两个字节:使用汉字两个字即4个字节对应的ASCII之原创 2015-03-30 15:04:32 · 3051 阅读 · 7 评论 -
C++实现二叉树相关操作
测试环境:windows 7 vs2010主要实现二叉树的初始化递归和非递归遍历,层次遍历,获取叶子节点的个数,获取树的高度以及镜像树,部分代码也参考了互联网上的相关资料。源程序:BinaryTreeNode.h#ifndef _BINARY_NODE#define _BINARY_NODE#includeusing namespace std;templatest原创 2015-07-28 19:49:58 · 1373 阅读 · 0 评论 -
栈(stacks)可变数组实现
其使用数组实现方式: 实现平台:widows 7 vs2010原创 2014-10-21 15:40:13 · 969 阅读 · 0 评论 -
递归相关的的两道面试题
腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?分析题目:到第一层只有一种情况上一阶即可即为1到第二层有两种情况11和2到第三层有111、12、21三种情况到第四层有1111、121、112、22、211吴种情况...要到第50层要么从48层上两阶到达或者从49层上一阶到达f(50)=f(49)+f(48)同理:f(49)=f(4原创 2015-03-20 21:33:16 · 1141 阅读 · 0 评论 -
获取内存中整数二进制形式
采用移位和相与方式求整数在内存中的二进制形式。#includetypedef int DataType;int num_covert_binary(DataType num);void main(){ DataType num; num = -1; num_covert_binary(num); num = 12; num_covert_binary(num); get原创 2015-03-28 14:09:18 · 1564 阅读 · 0 评论 -
C++实现大数据乘法
1.测试环境 vs2013 windows 7采用累乘的方式实现,然后再统一的进位,最后将其在转换为字符串,输出。程序代码:#define _CRT_SECURE_NO_WARNINGS#includestruct BigDataMutliplie{private: char data_a[100]; char data_b[100]; int len_a; int原创 2015-05-15 08:11:02 · 2013 阅读 · 0 评论 -
链式队列C++实现
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。实现思路:LinkQueue.h#pragma once#includetemplateclass LinkQueue{private: struct Node { T原创 2015-06-16 18:45:10 · 949 阅读 · 0 评论 -
C++实现快速排序
快速排序是一个递归的过程,只要能够实现一趟快速排序的算法,就可以利用递归的方法对一趟快速排序后的左右分区域分别进行快速排序。会时常出现面试和笔试题目中。值得强调是:最好的情况是枢纽元素选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn),最坏情况是枢纽元素为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2)。排序思路:源码:#includeu原创 2015-06-18 08:17:50 · 985 阅读 · 0 评论 -
C++ 实现链式栈
测试环境:vs2010 windows7stack.hpptemplateclass LinkStack{private: int NodeNum; struct Node //栈的节点 { T data; struct Node *next; }; struct Node *pTop;//栈顶public: LinkStack(); ~LinkSta原创 2015-06-10 14:50:02 · 771 阅读 · 0 评论 -
基于QT的异质链表实例
所谓的异质链表就是的节点元素类型可以不同。本实例采用C++抽象类和多态实现。#include #include#include// 基类class base{public: virtual void show()=0;};//异质链表class LinkList{private: struct Node { base *pb;//数据原创 2015-07-01 15:50:33 · 1360 阅读 · 0 评论 -
获取整数二进制1的个数
采取两种方法来获取整数的二进制1的个数1.采取左移和相与的方法2.采取减1和相与的方法程序:#include#includestruct CountCalc{public: int count_one_use_leftshift(int num) //采取左移和相与的方法 { int count=0; int flag=1; while(flag) {原创 2015-07-05 21:09:13 · 753 阅读 · 0 评论 -
C++ 递归和非递归实现链表逆序
测试环境:vs2010 windows7逆序分别采用递归调用和链表头插法实现逆序。具体代码如下:#include#includeusing namespace std;class LinkList{private: struct Node { struct Node *next; int value; }; Node *phead; void rever原创 2015-07-14 19:40:12 · 1657 阅读 · 0 评论 -
C++实现位数组
当我们遇到大量整数排序时候为了节省内存空间我们可以考虑使用bit数组来实现,缺点是其只适用于正整数。思想:在32位系统一个int类型占4个字节,按位来计算一个int类型可以记录32个数,因此,采用int型数组和移位来实现相关功能。C++实现bit数组#includeusing namespace std;const unsigned int bitValue[32]={ 0原创 2015-08-12 16:23:31 · 3944 阅读 · 0 评论 -
递归与非递归及其相互转换
一、什么是递归递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了。二、递归的几个特点1.递归式,就是如何将原问题划分成子问题。2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口。3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢三、递归的转载 2015-07-23 22:33:28 · 997 阅读 · 0 评论 -
C++ 实现堆排序
堆定义:由n个元素组成的序列{k1,k2,...,kn-1,kn},当且仅当满足如下图关系时,称之为堆若将和此序列对应的一维数组看成一个完全二叉树,树中每个结点对应于原始数据的一个记录,并且每个结点应满足以下条件:非叶结点的数据大于或等于其左、右孩子结点的数据(若是按从大到小的顺序排序,则要求非叶结点的数据小于或等于其左、右孩子结点的数据)。 由堆的定义可看出,其根结点为最大值,原创 2015-08-18 21:49:28 · 923 阅读 · 0 评论 -
栈(stacks)数组实现
堆栈(Stack):栈是允许在一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。栈结构也称为后进先出表(LIFO)。原创 2014-10-15 21:05:51 · 728 阅读 · 0 评论