数据结构学习
猿来如此~
心中所想,便是远方
展开
-
LRU的Cache
LRU算法:LRU算法又叫做最久未使用算法,本质是将最久未被使用的数据删除LeetCodeLRU算法缓存机制:class LRUCache //LRUCache的类{ int _capacity; unordered_map<int, list<pair<int, int>>::iterator> _ht; list<pair<int, int>> _lru_lt;public: LRUCache(int capacity) :_原创 2020-08-05 21:09:35 · 314 阅读 · 0 评论 -
栈的压入、弹出序列
已知两个数组,pushV存的是栈的压入序列,本题需要判断popV序列是不是pushV的弹出序列做法:找一个辅助的栈,只要这个栈的空或者栈顶不等于当前的popV[i]的元素,就不断的向辅助栈中压入这个元素,直到栈不空,并且栈顶与popV[i]相等,就直接pop这个辅助栈,但是有个问题就是,在压入的时候j有可能会>n,如果一旦大于,则不可能是弹出序列,最终的判断是这个栈是不是空的栈,如果是空的...原创 2020-02-25 20:53:40 · 204 阅读 · 0 评论 -
位图、布隆过滤器及其相关面试题
位图:为了处理大量数据的问题,位图的出现极大的节省了我们进行大数据计算是的时间复杂度以及节省了大量的空间,位图主要利用的是位,使用8位二进制表示8个数字,相当于一个字节就可以表示8个数字,极大的节省了空间,而且在查找的时候的复杂度可以达到O(1)布隆过滤器:我们在给客户推送视频的时候,我们只会推荐客户没有看过的视频,那么我们如何来确定那个视频用户看过了,那个用户没有看过,在这里我们如果使用哈...原创 2020-02-14 15:52:01 · 344 阅读 · 0 评论 -
unordered_map\unordered_set的模拟实现及注意事项
unordered_maptemplate<class K, class V, class KeyofValue, class HF> class unordered_map { typedef pair<K, V> ValueType; typedef HashBucket<K, ValueType, KeyofValue, HF> HT; ...原创 2020-02-11 22:15:51 · 172 阅读 · 0 评论 -
数据结构---判断链表是否有环,返回环的结点
判断一个链表是否有环,直接使用两个指针,一个一次走一步,一个一次两步,然后往后面开始遍历,如果相遇的话,就肯定有环。int SListHasCycle(SList* plist){ SListNode * fast = plist->_head; SListNode * slow = plist->_head; while (slow && fast &...原创 2019-11-01 21:28:34 · 177 阅读 · 0 评论 -
数据结构---分叉链表
原理:检查一个链表是不是分叉链表,将两个头分别记录,然后看看这两个链表的长度,如果不一样就直接将长的先走long-short个结点,然后同时走,如果走的时候发现下一个结点相同的话,那么就是分叉链表//分叉链表SListNode * getIntersectionNode(SList* listA, SList* listB){ int lenA = 0; int lenB = 0; S...原创 2019-11-01 21:19:15 · 698 阅读 · 0 评论 -
数据结构---链表逆置(不创建空间)
1.方法一:找一个cur与tmp分别指向head和head->next,然后将cur->next变成tmp->next,然后将此时的第二个结点指向现在的head,接下来就将tmp后移,此时完成的相当于就是将原来的head->next,变成了现在的头,原来的head变成了现在的第二个结点,然后重复上述动作就可以在不创建空间的前提下,逆置链表。代码图:void SList...原创 2019-11-01 21:08:38 · 615 阅读 · 0 评论 -
二叉树的七种遍历(三种递归,三种非递归)
二叉树的头文件…不包含里面所用的栈和队列的头文件在非递归里面会用到,非递归只阐述思想,不写代码,递归代码如下:#ifndef _BTREE_H_#define _BTREE_H_typedef char BTDataType;typedef struct BinaryTreeNode{ BTDataType _data; struct BinaryTreeNode* lchi...原创 2019-08-21 14:45:02 · 226 阅读 · 0 评论 -
排序---快速排序(非递归)
非递归算法的可以使用栈和队列来实现,两者的区别就在于相反的进出,除此之外都一样//void QuickSortNonR(int *src, int n)快速排序的非递归算法//{// int start = 0, end = n - 1;// Queue qu;// QueuePush(&qu, start);// QueuePush(&qu, end);//// ...原创 2019-08-24 16:01:57 · 217 阅读 · 0 评论 -
排序---快速排序(递归)
快速排序的递归写法,总共写了四种方法:两个双指针法、挖坑法、hoare法快速排序的时间复杂度为O(nlogn),表现为不稳定的算法快速排序的数组在交换或者覆盖的过程中,相同的数字可能会出现位置的变换//快排相当于二叉树的前序遍历void swapArgs(int *pa, int *pb){ int tmp; tmp = *pa; *pa = *pb; *pb = tmp;}...原创 2019-08-24 15:59:32 · 278 阅读 · 0 评论 -
排序---归并排序
归并排序要借助一个临时的空间(相当于二叉树的后序),归并排序比较特殊,它的算法的时间复杂度虽然是O(nlogn),但是它是稳定的,在分开在合并的过程中各个数字的位置不会发生其他变化void dealMergeSort(int *src, int *tmp, int start, int end)//里面自己的函数实现{ if (start >= end) { return; }...原创 2019-08-24 15:55:30 · 110 阅读 · 0 评论 -
排序---希尔排序
希尔排序可以说是插入排序的优化,算法的时间复杂度为O(nlogn),算法不稳定在数字比较多的时候,希尔排序在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动void ShelSort(int *src, int n){ int i, j, k; int gap, tmp; for (gap = n / 2; gap; gap /= 2) { for (k = 0; k...原创 2019-08-24 15:52:32 · 229 阅读 · 0 评论 -
排序---直接插入排序
直接插入排序的算法的时间复杂度为O(n^2),算法比较稳定算法稳定的原因:直接插入排序是将每一个数字进行插入排序,不会出现问题void InsertSort(int *src, int n)//直接插入排序(数组足够小时最优,数组越有序插排越快)(稳定){ int i, j; int tmp; for (i = 1; i < n; i++) { tmp = src[i];...原创 2019-08-24 15:47:45 · 159 阅读 · 0 评论 -
数据结构实验二
1.编写函数,采用链式存储实现栈的初始化、入栈、出栈操作2.编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作3.编写函数,采用链式存储实现队列的初始化、入队、出队操作4.编写函数,采用顺序存储实现队列的初始化、入队、出队操作5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法#define _CRT_SECURE_NO_WARNINGS#include<stdi...原创 2019-05-09 20:37:57 · 1973 阅读 · 0 评论 -
数据结构二叉树
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100typedef char DataType;typedef struct BiTNode /* 二叉链表存储结构 */{ DataType data; struct BiTNode *lc...原创 2019-05-27 19:48:47 · 81 阅读 · 0 评论 -
数据结构实验 查找
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <stdio.h>#include <stdlib.h>#include<string.h>#include<algorithm>#include<math.h>#include<queue...原创 2019-06-09 22:28:43 · 576 阅读 · 0 评论 -
数据结构链表的头插法建立、删除、计数、查找、输出
#define _CRT_SECURE_NO_WARNINGS#include "LIST.h"#include <stdio.h>#include <stdlib.h>void InitLinkLinst(List *L){ *L = NULL;}void PushFront(List* L, int d)//头插{ Node* cur = *L...原创 2019-06-21 15:30:42 · 563 阅读 · 0 评论 -
数据结构-顺序表、链表-基本操作
#ifndef SLIST_H_#define SLIST_H_#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int SLTDataType;typedef struct SListNode{ SLTDataType _data; struct SListNo...原创 2019-06-23 23:02:05 · 146 阅读 · 0 评论 -
双向循环带头结点的基本操作
#ifndef _LIST_H_#define _LIST_H_#include <stdio.h>#include <stdlib.h>#include <string.h>typedef int LTDataType;typedef struct ListNode{ LTDataType _data; struct ListNode* ...原创 2019-06-29 22:18:51 · 96 阅读 · 0 评论 -
单向无头单链表的一些特殊的问题及其解决方法
//判断链表里面是否有环int SListHasCycle(SList* plist){ SListNode * fast = plist->_head; SListNode * slow = plist->_head; while (slow && fast && fast->_next) { slow = slow->_n...原创 2019-06-29 22:20:23 · 170 阅读 · 0 评论 -
用数组实现循环队列
#include "dequeue.h"//用数组写循环队列void dequeueInit(Dequeue * qu)//初始化循环队列{ qu->_head = qu->_tail = qu->_data;//初始位置,队列为空,队首==队尾==数组的首位置 qu->_size = 0;//此时队列的大小为0}void dequeueEmpty(D...原创 2019-07-07 14:38:01 · 743 阅读 · 0 评论 -
c语言中栈的相关:入栈、出栈、销毁栈、打印栈、初始化栈
#ifndef STACK_H_#define STACK_H_#include <stdio.h>#include <stdlib.h>// 支持动态增长的栈typedef int STDataType;typedef struct StackNode{ struct StackNode * _next; STDataType _data;}Sta...原创 2019-07-12 16:02:28 · 367 阅读 · 0 评论 -
数据结构练习
1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)2.编写函数,实现遍历单链表3.编写函数,实现把单向链表中元素逆置4.编写函数,建立一个非递减有序单链表5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序7.编写函数,实现在非递减有序链表中删除值为x的结点8.编写一个...原创 2019-04-19 17:16:42 · 1070 阅读 · 1 评论