数据结构
数据结构相关内容
乌克兰水晶小乳猪
一个计算机专业的学生
展开
-
设计模式了解吗,手写单例模式,有哪些问题
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化。单利模式应该用场景:核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点应该在什么时候下使用单例模式?举一个小例子,在...原创 2019-10-02 20:09:06 · 534 阅读 · 0 评论 -
面试官:小伙子,来给咋们写一个位图吧
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<vector>#include<iostream>using namespace std;class BitSet{public: void Set(size_t x)//把那个位设置成1,代表存在 { //size_t index = x / ...原创 2019-10-03 20:46:11 · 264 阅读 · 0 评论 -
海量数据面试题
哈希切割给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?思路 :1 . 使用哈希切割 , 将100G大小的文件分成1000分小文件 ,2 . 使用 HashStr( IP )%1000 将每个文件上的IP地址映射到哈希表中 , 然后将IP地址转化成整数形式3 . 使用Key Value 模型 , 将IP地址出现的次数保存起来...原创 2019-10-04 15:16:43 · 315 阅读 · 0 评论 -
八大排序算法及其优化
常见的排序算法1. 插入排序算法基本思想特性总结:元素集合越接近有序,直接插入算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定...原创 2019-10-15 14:44:13 · 490 阅读 · 3 评论 -
八大排序的实现及其优化
八大排序(1)直接插入void InsertSort(int*a, int n){ for (int i = 0; i < n - 1; i++) { int end = i; int tmp = a[end + 1]; while (end >= 0) { if (a[end] > tmp) { a[end + 1] = a[e...原创 2019-01-14 17:33:22 · 329 阅读 · 0 评论 -
存在重复元素
class Solution {public: bool containsDuplicate(vector<int>& nums) { set<int> s; for(auto e: nums) { if(s.find(e) == s.end())//find没找到返回的是end迭代...原创 2019-10-04 17:22:45 · 234 阅读 · 0 评论 -
重复N次的元素
class Solution {public: int repeatedNTimes(vector<int>& A) { size_t N = A.size() / 2; // 用unordered_map统计每个元素出现的次数 unordered_map<int, int> m; for (auto e : A) m[e]++; /...原创 2019-10-04 15:51:47 · 363 阅读 · 0 评论 -
set的基本用法
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<map>#include<set>#include<string>using namespace std;void test_set(){ //1. key.查找关键字在不在 //2. 排序 + 去重 //3. ...原创 2019-10-02 16:07:04 · 680 阅读 · 0 评论 -
map的基本操作
map的基本操作#include<iostream>#include<map>#include<set>#include<string>using namespace std;//mulimap与map的区别//(1)mulimap允许key冗余,但是map不允许key冗余//(2)mulimap没有operator[],但是map...原创 2019-09-28 18:34:58 · 421 阅读 · 0 评论 -
AVLTree和RBTree的性能分析
下面一张图就能看出两者的区别以及性能分析:原创 2019-10-02 15:53:45 · 557 阅读 · 0 评论 -
AVL树的基本操作
AVL树的性能AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证 查询时高效的时间复杂度,即log2(N)log_2 (N)log2(N)。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位 置。因此:如果需要一种查询高效且有序的数据结构,而且数...原创 2019-10-01 17:56:28 · 381 阅读 · 0 评论 -
unordered_set/unordered_map与map/set 关联式容器的性能测试
unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2Nlog_2 Nlog2N,即最差情 况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比 较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方...原创 2019-10-02 18:56:18 · 790 阅读 · 0 评论 -
关联式容器面试题合集
说说你所知道的容器都有哪些?vector,list,map,set,mulimap,muliset等等map与set的区别?使用map有哪些优势?map的底层原理,说下红黑树?map的迭代器会失效吗?什么情况下会失效?AVLTree和RBTree的对比,为什么map使用了红黑树?红黑树的优势是什么?AVLTree和RBTree所达到的平衡有什么区别?...原创 2019-10-02 16:23:51 · 892 阅读 · 0 评论 -
哈希的应用(位图,布隆过滤器)
位图(整型)1.面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数 中。【腾讯】遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN位图解决 数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比 特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。位图...原创 2019-10-04 14:31:02 · 348 阅读 · 0 评论 -
哈希部分常见面试题
unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。哈希的概念原创 2019-10-03 18:10:41 · 1026 阅读 · 0 评论 -
用两个栈实现队列
class MyQueue {public: /** Initialize your data structure here. */ stack<int> s1, s2; MyQueue() { } /** Push element x to the back of queue. */ void push(...原创 2019-09-25 14:56:46 · 209 阅读 · 0 评论 -
用队列实现栈
class Mystack {public: queue<int> q; //压栈是一样的 void push(int x) { q.push(x); } //移除栈顶元素 int pop() { int size = q.size() - 1; for (int i = 0; i < size; i++) { int tmp = q....原创 2019-09-24 16:20:22 · 220 阅读 · 0 评论 -
逆波兰表达式求值(栈)
逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: [“2”, “1”, “+”, “3”, “*”]输出: 9解释: ((2 + 1) * 3) = 9...原创 2019-09-23 19:58:39 · 386 阅读 · 0 评论 -
栈的弹出压入序列
栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)举例:入栈1,2,3,4,5出栈4,5,3,2,1...原创 2019-09-23 19:32:35 · 399 阅读 · 0 评论 -
链表的回文结构
public class PalindromeList { public boolean chkPalindrome(ListNode A) { // write code here ListNode fast = A; //都指向头结点 ListNode slow = A; //找mid结点 ...原创 2019-10-06 19:29:21 · 219 阅读 · 0 评论 -
删除链表中重复的元素
#define _CRT_SECURE_NO_WARNINGS 1class Solution {public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead == NULL || pHead->next == NULL){ return pHead; } ListNode* Head = new List...原创 2019-10-06 18:56:02 · 217 阅读 · 0 评论 -
链表分割
class Partition {public: ListNode* partition(ListNode* pHead, int x) { ListNode* bigListNode = new ListNode(-1); ListNode* smallListNode = new ListNode(-1); ListNode* b = ...原创 2019-10-06 17:34:43 · 236 阅读 · 1 评论 -
合并两个有序链表
class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* phead = new ListNode(-1); ListNode* prev = phead; while(l1 && l2)...原创 2019-10-06 16:38:31 · 247 阅读 · 0 评论 -
链表中倒数第K个节点
class Solution {public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead == NULL || pListHead->next == NULL) return pListHead; L...原创 2019-10-06 16:03:45 · 221 阅读 · 2 评论 -
链表的中间节点
class Solution {public: ListNode* middleNode(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode* cur = head; int count = 0; ...原创 2019-10-06 15:39:17 · 236 阅读 · 0 评论 -
删除链表中等于给定值 val 的所有节点
class Solution {public: ListNode* removeElements(ListNode* head, int val) { if(head==NULL){ //头节点为空,直接返回null return NULL; } ListNode* prev=head; ListNode* c...原创 2019-10-06 14:11:48 · 273 阅读 · 0 评论 -
顺序表的各个接口演示
重点看一下这个函数------>void SeqListRemoveAll(SeqList* ps, SLDataType x) ;#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>#include<stdlib.h>#pragma oncetypedef i...原创 2019-10-05 14:28:24 · 251 阅读 · 0 评论 -
红与黑
链接:https://www.nowcoder.com/questionTerminal/5017fd2fc5c84f78bbaed4777996213a来源:牛客网有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。输入描述:输入包含多组数据。每组数据第一...原创 2019-07-23 19:49:18 · 542 阅读 · 0 评论 -
二叉搜索树的增删查
二叉搜索树的查找: Node* Find(const T& data) { Node* pcur = _proot; while (pcur) { if (data == pcur->_data) return pcur; else if (data < pcur->_data) pcur = pcur->_pleft;...原创 2019-09-30 19:14:51 · 315 阅读 · 0 评论 -
二叉树层序遍历2
class Solution {public: vector<vector<int>> levelOrderBottom(TreeNode * root) { // write your code here vector<int> w; vector<vector<int>> v...原创 2019-09-24 17:19:47 · 262 阅读 · 0 评论 -
二叉树的层序遍历(队列)
思路:二叉树的层次遍历通过队列来进行,先将root进队,进入循环。判断队列是否为空,不为空将此时队列中的元素一个一个出队,同时将子女入队。这样每次出队的元素都为一个层次中的。这是广度优先搜索,深度优先搜索用栈来进行。class Solution {public: vector<vector<int>> levelOrder(TreeNode* root...原创 2019-09-24 16:59:07 · 930 阅读 · 0 评论 -
搜索二叉树的实现与性能分析
搜索二叉树的实现搜索二叉树的性能分析1.插入和删除都必须先查找,查找效率代表了搜索二叉树中各个操作的性能2.对有n个节点的二叉搜索树,若每个元素的查找概率相等,则二叉搜索树平均查找长度是节点在二叉搜索树的深度的函数,即结点越深,比较次数越多。3.但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:lo...原创 2019-04-23 13:19:14 · 1611 阅读 · 0 评论 -
搜索二叉树的查找,插入与删除操作图解
二叉搜索树1.二叉搜索树的概念二叉搜索树又称二叉排序树,或者是一颗空树,或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值(3)它的左右子树也分别为二叉搜索树={5,3,4, 1,7, 8,2, 6,0, 9}顺便回顾一下二叉树前中后序遍历是怎么遍历的前序(根左右):5...原创 2019-04-12 21:04:03 · 1602 阅读 · 0 评论