数据结构
文章平均质量分 55
Dyson~
小小黑
展开
-
数据结构--单链表的基本功能实现
链表实现下面功能//初始化链表void InitLinkList(pList* pplist);//销毁链表void DestroyLinkList(pList* pplist);//销毁节点void Destroy(pList* pplist);//打印void PrintList(pList plist);//尾插void PushBack(pList* pplist,...原创 2018-06-30 11:08:23 · 1539 阅读 · 0 评论 -
数据结构--哈希扩展 ( 布隆过滤器 )
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。基本概念 : 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着...原创 2018-09-11 17:21:06 · 394 阅读 · 0 评论 -
数据结构--搜索结构之哈希一( 闭散列 ) ( c语言版 )
哈希概念 : 顺序搜索以及二叉树搜索树中,元素存储位置和元素各关键码之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的 多次比较。搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找...原创 2018-09-03 20:21:24 · 417 阅读 · 0 评论 -
数据结构--模拟链表( C语言版 )
模拟链表 : 链表中的每一个节点都有一个指针域和数据域 , 要使用数组去模拟链表则需要两个数组去实现 , 一个数组data相当于链表中的数据域存储数据 . 一个数组right相当于指针域存储第一个数组中所要访问元素的下标 , right数组中的存储模式是存放当前序列中每一个元素右边的元素在数组中的位置 , 如下所示 : data :下标 : 1 2 3 4...原创 2018-09-03 22:59:35 · 766 阅读 · 0 评论 -
海量数据面试题
位图应用 : 题目一 : 位图应用给定100亿个整数,设计算法找到只出现一次的整数思路 : 用位图 , 当元素存放时判断该位是不是已经有元素存放过 , 若存放过则不处理 , 否则进行存放题目二 : 给两个文件分别有100亿个整数,我们只有1G内存,如何找到两个文件交集思路 : 我们可以用两个位图 , 两个位图可以组成用两个为组成三种状态 , 都不存在 ( 0 0 ) , 都存在 ( ...原创 2018-09-12 22:55:49 · 396 阅读 · 0 评论 -
排序算法之插入排序( 直接插入 & 希尔 ) ( C语言版 )
插入排序基本思想 : 每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止。【直接插入排序】:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序 进行比较,找到插入位置即将array...原创 2018-09-10 16:15:06 · 1016 阅读 · 0 评论 -
数据结构--哈希变形 ( 位图 )
解决问题 : 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中 . 当我们遇到这个问题时,可能第一时间会想到哈希搜索, 但是仔细发现 , 当我们使用哈希去解决该问题时 , 就会发现1KB=1024Byte 1MB=1024KB 1G=1024MB 而10亿个Byte大约就是1G , 40亿个Byte大约就是4G , 而题中条件为无符号整数 , 那...原创 2018-09-10 18:17:53 · 283 阅读 · 0 评论 -
贪心算法问题
一、概念1. 贪心法(Greedy Algorithm)定义 求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择; 贪心法就是这样的算法:它在每个决策点作出在当时看来最佳的选择,即总是遵循某种规则,做出局部最优的选择,以推导出全局最优解(局部最优解->全局最优解)2. 对贪心法的深入理解 (1)原理:一种启发式...转载 2018-09-15 15:44:37 · 20602 阅读 · 2 评论 -
排序算法之选择排序( 选择排序 & 堆排序 )
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法 【直接选择排序】在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中 的最后一...原创 2018-09-26 13:24:39 · 246 阅读 · 0 评论 -
排序算法之交换排序( 冒泡排序 & 快速排序(三种实现方法及其优化,非递归) ) ( C语言版 )
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡...原创 2018-09-26 17:15:48 · 794 阅读 · 0 评论 -
排序算法之归并排序 ( C语言版 )
归并排序 :(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并, 使用中牺牲空间换取时间的算法 归并算法核心步骤为 : 分解 合并图片来源 --- https...原创 2018-09-27 10:53:30 · 35390 阅读 · 4 评论 -
排序算法之计数排序 ( C语言版 )
计数排序:计数排序又称为鸽巢原理,是对哈希直接定制法变形应用,是一种稳定的算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法,当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)),如归并排序,堆排序)操作...原创 2018-10-07 11:37:38 · 6572 阅读 · 1 评论 -
数据结构--搜索结构之哈希二( 开散列 拉链法) ( c语言版 )
开散列: 开散列法又叫链地址法(开链法) , 哈希桶开散列法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。设元素的关键码为37, 25, 14, 36, 49, 68, 57, 11, 散列表为HT[11],表的大小为11,散列函数为Hash(x) = x % 11...原创 2018-09-04 15:24:34 · 1275 阅读 · 1 评论 -
数据结构--二叉搜索树( KeyValue模型 )
二叉搜索树应用 : 模拟实现一个简单的词典实现功能 : 插入 ( 与二叉搜索树的插入方法一致 ) 删除 ( 与二叉搜索树的删除方法一致 ) 查询 ( 与二叉搜索树的查询方法一致 ) 打印 ( 中序打印 )二叉树搜索树的基本操作 : 传送门 https://blog.csdn.net/ds19980228/article/details/82120429数据结构 : ty...原创 2018-08-29 17:37:12 · 1070 阅读 · 0 评论 -
数据结构--动态顺序表的功能实现
顺序表实现下面功能//初始化 void InitSeqList(PSeqList pSeq); //尾部插入 void PushBack(PSeqList pSeq, DataType data); //尾部删除 void PopBack(PSeqList pSeq); //头部插入 void PushFront(PSeqList pSeq, DataType data); //头...原创 2018-06-24 21:24:13 · 387 阅读 · 0 评论 -
单链表面试题---判断两个链表是否相交( 不带环 )和( 可能带环 ) , 若相交 , 求交点
题目: 1 .判断两个链表是否相交 , 假设两个链表不带环 , 若相交 , 求出交点 2 .判断两个链表是否相交 , 假设两个链表可能带环 , 若相交 , 求交点假设两个链表不带环 解法 : 方法1. 遍历两个链表 , 记录两个链表的长度 , ①当两个链表的长度不相等 , 则长链表先走len_max - len_min长度 , 然后两个链表同时前进 , 并且比较 , 当两个链...原创 2018-07-06 18:33:25 · 901 阅读 · 0 评论 -
链表面试题---复杂链表的复制
复杂链表 : 在复杂链表中,每个节点除了有一个next指向下一节点外,还有一个random指向任意节点或者NULL 代码如下 :Linklist.h 头文件#ifndef __LINKLIST_H__#define __LINKLIST_H__#include <stdio.h>#include <stdlib.h>#i...原创 2018-07-13 17:24:39 · 263 阅读 · 1 评论 -
数据结构--带头双向循环链表的基本功能实现
带头双向循环链表 : 是一种无死角链表, 是链表的一种,带有头结点, 其次它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点 , 且它的头指向尾 , 尾指向头 , 是循环的 , 是双向的 , 是带头结点的 ,基本结构如下图所示 : ...原创 2018-08-18 22:47:29 · 313 阅读 · 0 评论 -
栈和队列的定义和基本操作(c语言版)
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈就可以理解为:先入后出(LIFO)Stack.h#pra...原创 2018-08-16 15:10:15 · 8204 阅读 · 4 评论 -
栈和队列面试题
面试题1:实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)解题思路:我们可以利用一个辅助栈(MinStack),用来存储最小值,在最开始的情况下两个栈同时入,当继续入栈时判断该元素是否小于或等于上一个入栈元素,若小于或等于则同时入两个栈,否则只入Stack,当出栈时用MinStack的栈顶元素和Stack栈顶元素比较,若相等则两个栈同时出栈,最后...原创 2018-08-17 16:53:44 · 218 阅读 · 0 评论 -
数据结构--二叉树基本操作(二叉树面试题)
二叉树的基本概念就不多说了 代码如下BinaryTree.c#pragma once#include <stdio.h>#include <malloc.h>#include <assert.h>#include <stdlib.h>typedef char BTDataType;typedef struct BinaryT...原创 2018-08-20 17:17:35 · 292 阅读 · 0 评论 -
数据结构--非递归实现二叉树的先序,中序,后序遍历
如上图所示 : 二叉树的先序遍历顺序为: A B D C E F 中序遍历顺序为 : D B A E C F 后序遍历顺序为 : D B E F C A先序遍历(非递归) : 方法一 : 先将元素左边全部入栈 , 入栈同时打印入...原创 2018-08-20 18:00:00 · 606 阅读 · 0 评论 -
数据结构--栈的应用 ( 迷宫问题 )
迷宫问题 : 其中要使用栈 栈的定义和基本操作 : 传送门 https://blog.csdn.net/ds19980228/article/details/81741617简单迷宫 : 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 ...原创 2018-08-30 21:38:39 · 1427 阅读 · 0 评论 -
数据结构--二叉搜索树( 概念 & 基本操作 ) ( C语言版 )
二叉搜索树概念 : 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的 二叉树若它的左子树不为空,子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树如下图所示 : int [ a ] = { 5 , 3 , 4 , 1 , 7 , 8 , 2 , 6 , 0 , 9 } ;按照中序...原创 2018-08-27 23:56:18 · 340 阅读 · 0 评论 -
数据结构--堆( 创建 & 插入 & 删除 & 应用 )
堆的基本概念 : 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。正常的数组存储 : 改为堆存储后 : 大堆 arry[] = {9 , 17 , 65 , 23 , 45 , 78 , 87 , 53 , 31}; ...原创 2018-08-24 21:49:22 · 1595 阅读 · 0 评论 -
LeetCode--110 平衡二叉树 ( Balanced Binary Tree )( C语言版 )
题目描述 :方法一:需要重复遍历节点多次解法,当遍历到一个节点时就将左右子树的的深度计算出来,然后判断是否满足条件/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *rig...原创 2018-10-07 15:30:39 · 514 阅读 · 0 评论