算法与数据结构

如何提升你的数据结构、算法以及解决问题的能力

雨燕双飞 提交于 2019-12-16 15:05:37
如何提升你的数据结构、算法以及解决问题的能力 这篇文章借鉴了我过去在学校一个学期的个人经历和挑战,当我进入学校的时候,我对任何 DSA(数据结构和算法)和解决问题的策略几乎一无所知。作为一名自学成才的程序员,我对一般编程会更加熟悉和舒适,例如面向对象编程,而不是 DSA 问题所需要的解决问题的能力。 这篇文章反映了我整个学期的经历,并包含了为了快速提高数据结构、算法和解决问题的能力而求助的资源。 面临问题:你知道原理,但是你被实际应用卡住了 我在学期初期的时候遇到这个问题,当时我不明白我哪里不懂,这是一个特别严重的问题。我对这个理论很了解,例如,什么是链表,它是如何工作的,它的各种操作和时间复杂度,它支持的 ADT(抽象数据类型),以及如何实现 ADT 操作。 但是,由于我不明白我哪里不懂,所以我无法确定我对它的理解和在实际应用中解决问题的差距。 不同类型的问题 一个数据结构问题的例子:描述如何在链表中插入一个节点并说明时间复杂度。 这是一个算法问题:在旋转数组中查找元素并说明时间复杂度。 最后是解决问题的疑虑,我认为比之前两个问题的级别更高,这可能需要简要描述一个场景,并且列出问题的要求。在考试中,可能会要求你对解决方案进行描述。在编程比赛中,可能会要求你在不明确提供任何的数据结构和算法的情况下提交可运行的代码。换句话说

Java集合框架常见面试题

给你一囗甜甜゛ 提交于 2019-12-16 14:56:15
点击关注 公众号 及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 剖析面试最常见问题之Java基础知识 说说List,Set,Map三者的区别? Arraylist 与 LinkedList 区别? 补充内容:RandomAccess接口 补充内容:双向链表和双向循环链表 ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢? 说一说 ArrayList 的扩容机制吧 HashMap 和 Hashtable 的区别 HashMap 和 HashSet区别 HashSet如何检查重复 HashMap的底层实现 JDK1.8之前 JDK1.8之后 HashMap 的长度为什么是2的幂次方 HashMap 多线程操作导致死循环问题 ConcurrentHashMap 和 Hashtable 的区别 ConcurrentHashMap线程安全的具体实现方式/底层具体实现 JDK1.7(上面有示意图) JDK1.8 (上面有示意图) comparable 和 Comparator的区别 Comparator定制排序 重写compareTo方法实现按年龄来排序 集合框架底层数据结构总结 Collection 1. List 2. Set Map 如何选用集合? 剖析面试最常见问题之Java基础知识

数据结构与算法——day02

会有一股神秘感。 提交于 2019-12-16 04:54:55
前言 今天大致了解了链表的基本概念,然后着重学习了单链表的增删改查、统计单链表的有效节点数和按序查找单链表的节点。由于时间原因,还要复习考试,并且这次学习的也是比较多啦,所以剩余的单链表的三个方法就明天再学之后再加上一个补充。综合来看这次的学习代码比较多,知识概念比较少。OK,切入正题! 何为链表? 链表是 有序的列表 在内存中存储如下: 链表是以 节点 的方式来存储,是 链式存储 每个节点包含data 域, next 域:指向下一个节点. 两域 链表的各个节点 不一定是连续存储. 链表分 带头节点的链表 和 没有头节点的链表 ,根据实际的需求来确 文字很抽象? 来张单链表的存储图瞅瞅(原来我以为一直很好奇链式的代码要怎么写,用了java才知道是用类定义的,就有一种恍然大悟的感觉) 简单的概念介绍之后就是应用实例的代码编写,好,进入正文! 正文 应用实例是对于带头结点的英雄节点的单链表进行如下操作: 增加(分两种,一种是简单的来一个添加一个,第二种就是按no编号按顺序的添加) 删除(简单的删除节点操作) 修改(根据英雄的no修改英雄的信息) 查询(直接显示所有的英雄信息) 统计单链表中所有有效节点的个数(不包括头节点) 按index查找倒数第k个节点 最开始我是很好奇,为什么要用单链表实现?(不知道你们有没有这样的好奇) 其实单链表实现的方式不需要连接数据库等进行操作

数据结构常见面试题

让人想犯罪 __ 提交于 2019-12-15 20:44:56
数据结构常见面试题 1、数组和链表的区别。 从逻辑结构上来看 ,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。 从内存存储的角度看 ;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。 从访问方式类看 ,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。 2、简述快速排序过程 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大。 3)此时基准元素在其排好序后的正确位置 4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。 3、快速排序的改进 只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。实践证明,改进后的算法时间复杂度有所降低,且当k取值为 8 左右时,改进算法的性能最佳。 选择基准元的方式 对于分治算法

Spring

做~自己de王妃 提交于 2019-12-15 04:32:33
Java专栏 上一篇 主目录 下一篇 【前言】 需要完整笔记课件等资料请联系邮箱:shaneholmes@qq.com 关于 我的GitHub 【一些名词的解释】 对象关系映射 (对象/关系数据库映射、ORM:object relation mapping) EL表达式 (Expression Language) 以下是Spring笔记代码 Spring-Boot 《Spring Boot 入门》 传送门 《Spring-Boot打jar包》 传送门 《数据结构与算法 队列--循环队列的数组实现》 传送门 《数据结构与算法 链表--单链表》 传送门 《数据结构与算法 链表--双链表》 传送门 《数据结构与算法 链表--环形单链表(约瑟夫问题)》 传送门 《数据结构与算法 栈--栈的数组实现》 传送门 《数据结构与算法 栈--简单计算器》 传送门 《数据结构与算法 栈--迷宫问题》 传送门 《数据结构与算法 栈--8皇后问题》 传送门 《数据结构与算法 排序--冒泡排序》 传送门 《数据结构与算法 排序--插入排序》 传送门 《数据结构与算法 排序--选择排序》 传送门 《数据结构与算法 排序--希尔排序》 传送门 《数据结构与算法 排序--快速排序》 传送门 《数据结构与算法 排序--归并排序》 传送门 《数据结构与算法 排序--基数排序》 传送门 《数据结构与算法 查找-

数据结构:八大数据结构分类

蓝咒 提交于 2019-12-14 21:03:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 数组 栈 队列 链表 树 散列表 堆 图 数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 1、数组 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。 int[] data = new int[100]; data[0] = 1; 优点: 1、按照索引查询元素速度快 2、按照索引遍历数组方便 缺点: 1、数组的大小固定后就无法扩容了 2、数组只能存储一种类型的数据 3、添加,删除的操作慢,因为要移动其他的元素。 适用场景: 频繁查询,对存储空间要求不大,很少增加和删除的情况。 2、栈 栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。 栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。 3、队列 队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是

数据结构(树)

心已入冬 提交于 2019-12-14 17:39:14
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 树: 树是 n个结点 的有限集合,有且仅有一个 根结点, 其余结点可分为m个根结点的 子树。 度: 指的是一个节点拥有子节点的个数。如二叉树的节点的最大度为2。 高度/深度: 数的层数,根节点为第一层,依次类推。 叶子节点: 度为0的节点,即没有子节点的节点。 二叉树: 在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子) 前序遍历(前根遍历): 根 ——>左——>右 中序遍历(中根遍历):左——> 根 ——>右 后序遍历(后根遍历):左——>右——> 根 满二叉树: 在一棵二叉树中,如果所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的树叫做满二叉树 高度为h,由2^h-1个节点构成的二叉树。 完全二叉树: 二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边。 二叉查找树(BST): 又称二叉排序树,亦称二叉搜索树(Binary Search Tree)。 定义: 一棵空树,或者是具有下列性质的二叉树: 1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3)左

Redis源码剖析--快速列表quicklist

我与影子孤独终老i 提交于 2019-12-14 17:19:07
在RedisObject这一篇博客中,有介绍到list结构的底层编码类型有OBJ_ENCODING_QUICKLIST,当时就发现这个底层数据结构被我遗漏了。昨天花了点时间补了补这个知识,看完发现这货就跟STL中的deque的思想一样,顿时觉得又是一个实现超级繁琐但很实用的数据结构。今天就带大家一起来看看这个“二合一”的数据结构。 quicklist是Redis在3.2版本加入的新数据结构,其是list列表的底层数据结构。 quicklist简介 为什么说quicklist是“二合一”呢?如果你看过STL中的deque的实现,就会知道deque是由一个map中控器和一个数组组成的数据结构,它既具有链表头尾插入便捷的优点,又有数组连续内存存储,支持下标访问的优点。Redis中是采用sdlist和ziplist来实现quicklist的,其中sdlist充当map中控器的作用,ziplist充当占用连续内存空间数组的作用。quicklist本身是一个双向无环链表,它的每一个节点都是一个ziplist。为什么这么设计呢? 双向链表在插入节点上复杂度很低,但它的内存开销很大,每个节点的地址不连续,容易产生内存碎片。 ziplist是存储在一段连续的内存上,存储效率高,但是它不利于修改操作,插入和删除数都很麻烦,复杂度高,而且其需要频繁的申请释放内存,特别是ziplist中数据较多的情况下

数据结构机测一

…衆ロ難τιáo~ 提交于 2019-12-14 16:12:24
顺序表应用4-2:元素位置互换之逆置算法(数据改进) #include <cstdio> #include <iostream> #define max 1000005 using namespace std; int *data; int m, len; // 元素翻转 如 1 2 3 4 5 ---》 5 4 3 2 1 void reverse(int begin, int end, int m) { for (int i = 0; i < m; i++) { int temp = data[begin]; data[begin++] = data[end]; data[end--] = temp; } } int main() { int t; // 下面两种是在堆里申请内存 int data[1000000] 是在栈里申请 // data = new int[max]; data = (int *)malloc(max * sizeof(int)); // 不手动申请内存 会爆内存 scanf("%d", &len); for (int i = 0; i < len; i++) { scanf("%d", &data[i]); } scanf("%d", &t); while (t--) { scanf("%d", &m); reverse(0, len - 1, len

Python算法与数据结构(四)------ 栈与队列

假如想象 提交于 2019-12-14 12:26:17
python栈与队列 目录 一. 栈 1.1 定义 1.2 栈的操作 1.3 栈的结构实现 二. 队列 2.1 定义 2.2 队列的操作 2.3 队列的实现 三. 双端队列 3.1 定义 3.2 操作 3.3 实现 目录 一. 栈 1.1 定义 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一端进行操作。因而按照后进先出(LIFO)的原理运作。 1.2 栈的操作 Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek() 返回栈顶元素 is_empty() 判断栈是否为空 size() 返回栈的元素个数 1.3 栈的结构实现 class Stack ( object ) : #栈 def __init__ ( self ) : self . __list = [ ] def is_empty ( self ) : #判断是否为空 return self . __list == [ ] def push ( self , item