前言:周末闲来无事,在七月在线上看了看字符串相关算法的讲解视频,收货颇丰,跟着视频讲解简单做了一下笔记,方便以后翻阅复习同时也很乐意分享给大家.什么字符串在算法中有多重要之类的大路边上的客套话就不多说了,直接上笔记吧. 一.字符串 java:String内置类型,不可更改.(如需更改可考虑:StringBuffer, StringBuilder,char[]等) 二.归类 字符串涉及到的相关题型通常会是以下几个方面: 概念理解:字典序 简单操作:插入删除字符.旋转 规则判断(罗马数字转换 是否是…
前言:周末闲来无事,看了看字符串相关算法的讲解视频,收货颇丰,跟着视频讲解简单做了一下笔记,方便以后翻阅复习同时也很乐意分享给大家.什么字符串在算法中有多重要之类的大路边上的客套话就不多说了,直接上笔记吧. 一.字符串 java:String内置类型,不可更改.(如需更改可考虑:StringBuffer, StringBuilder,char[]等) 二.归类 字符串涉及到的相关题型通常会是以下几个方面: 概念理解:字典序 简单操作:插入删除字符.旋转 规则判断(罗马数字转换 是否是合法的整数.…
前言 现在不管是大公司还是小公司,去面试都会问到多线程与并发编程的知识,大家面试的时候这方面的知识一定要提前做好储备. 关于多线程与并发的知识总结了一个思维导图,分享给大家 1.Java中实现多线程有几种方法 (1)继承Thread类: (2)实现Runnable接口: (3)实现Callable接口通过FutureTask包装器来创建Thread线程: (4)使用ExecutorService.Callable.Future实现有返回结果的多线程(也就是使用了ExecutorService来管…
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题…
字符串和整数一一映射的算法 公司每人的英文名不同,现在给每个英文名一个不同的数字编号,怎么设计? 走ipv4/6  2/32 2/128就够了,把“网段”概念对应到“表或库”,ip有a_e5类,这概念都可以引过来  和 时间 年月日  店铺 sellid  marketplaceid  amazon 平台参数对应 w 用uid分库,uname上的查询怎么办?  http://mp.weixin.qq.com/s/_HB7Iq9chDLk2z_m_btq9w 将以下解决了uid-uname单表的分…
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉树: 1) 是一棵完全二叉树 2) 通常由数组实现.前面介绍了如何用数组表示树 3) 堆中的每个节点都满足堆的条件,即每个节点的关键字都大于(或等于)这个节点的子节点关键字 下图显示了堆与实现它的数组之间的关系:  A: 堆是完全二叉树的事实说明了表示堆的数组中没有“洞”,从下标0到N-1,每个元素…
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应用中作为数据记录.它们常用于记录那些对应于现实世界的对象和活动的数据,如职员档案等,这些结构便于数据的访问:它们易于进行插入.删除和查找特定数据项的操作. 然而,本篇要讲解的数据结构和算法更多的是作为程序员的工具来运用.它们主要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期…
Q: 什么是外部存储? A: 外部存储特指某类磁盘系统,例如在大多数台式电脑或服务器中的硬盘. Q: 如何访问外部存储? A: 我们所学的数据结构都是假设数据存储在内存中,但是,在很多情况下要处理的数据量太大,不能都存储在内存中.这种情况下需要另一种存储方式,访问外部磁盘文件上的数据.外部磁盘存储的缺点就是读写比内存要慢得多,因此需要用一个合理的数据结构技术来管理它们. A: 作为外部存储的一个例子,假设编写一个数据库程序来管理一个电话簿,可能有500000条记录.每条记录包括姓名.地址.电话号…
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工…
栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector<E> { //继承Vector,Vector和ArrayList几乎相同,都是通过数组保存数据,只不过方法有Synchronized修饰 public Stack() { } public E push(E item) { //push,也就是add,把数据保存得add到数组的末尾 addEle…
在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树和链表几乎完全一样,是最不平衡的二叉树了,二分搜索树的效率直接降到最低 如何解决上述问题: 使二分搜索树保持平衡二叉树的特征,而今天要讲述的AVL树是最经典的平衡二叉树了 满二叉树: 除了叶子节点其余节点都有左右两个子节点的树 完全二叉树: 对于一个树高为h的二叉树,如果其第0层至第h-1层的节点都…
三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以“结点的序列”表示线性表,…
首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我java基础知识比较薄弱,想要找一本能够一边看一边敲代码感受一下实现程序的书,但是用java实现的都写的不咋滴.而且,目前学习数据结构比较迫切,因为接近找工作的节点,不需要我了解的多么细致,只要了解考点的那些就可以. 跋山涉水,翻山越岭,我终于找到了一本我既能看懂,又有java实现代码的书. 我本人…
  本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入…
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程.但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度.那么爬坡时使用1档,便可以获得更大的牵引力:下坡时便使用低档限制车的行驶速度.回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,数…
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗?以及数据结构与本篇博客的主题前缀.中缀.后缀表达式有什么关系呢? 1.人如何解析算术表达式 如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的: ①.求值 3+4-5 这个表达式,我们在看到3+4后都不能直接计算3+4的值,知道看到4后面的 - 号,因为减号的优先级和前面的加号…
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现,这种实现方式尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的时间 O(N),因为每次插入平均需要移动一半的数据项,来保证插入后,数组依旧有序. 本篇博客我们介绍另外一种数据结构——堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的“堆”是不一样的,这里的堆是一种树,…
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递归 的时候,介绍了归并排序,归并排序需要O(NlogN),这比简单排序要快了很多,但是归并排序有个缺点,它需要的空间是原始数组空间的两倍,当我们需要排序的数据占据了整个内存的一半以上的空间,那么是不能使用归并排序的. 本篇博客将…
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操…
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树(Binary Tree)两种,二叉树最多只允许有两个直接后继结点的有序树. 本篇将学习树的用途.运行机制以及创建树的方法. 为什么使用二叉树 Q: 为什么要用到树? A: 因为它通常结合了另外两种数据结构的优点:1)有序数组 2)链表.在树中查找数据项的速度和在有序数组中查找一样快,并且插入数据项…
希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插入排序的执行效率. Q: 回忆之前的插入排序,有哪些缺点? A: 回忆之前的简单排序的“插入排序”一节,在插入排序执行一半的时候,标记位i左边这部分数据项都是排过序的,而标记位右边的数据项则没有排过序.这个算法取出标记位所指的数据项,把它存储在一个临时变量里,接着,从刚刚被移除的数据项的左边第一个元…
三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的. 由此,第二项是由第一项(1)加上2,得3.第三项是由第二项(3)加上3得到6,依次类推. 这个序列中的数字被称为三角数字,因为它们可以被形象化地表示成对象的一个三角形排列.  Q: 如何使用循环求第N项? A: 示例:TriangleNumber.java Q: 如何使用递归求第N项? A: 导…
Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针对所有的元素重复以上的步骤,除了最后一个.因此总共有N - 1 趟; 4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. Q: 冒泡排序的Java代码? A: 示例: BubbleSort.java, BubbleSortTest.java Q: 冒泡排序的不变性? A: …
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的…
Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必就比懂得的人慢.写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车.如果你对这两件事都不感兴趣也就罢了,数据结构懂得用就好.但若你此生在编程领域还有点更高的追求,数据结构是绕不开的课题. Java 替你做了太多事情,那么多动不动还支…
Q1: 什么是2-3-4树? A1: 在介绍2-3-4树之前,我们先说明二叉树和多叉树的概念. 二叉树:每个节点有一个数据项,最多有两个子节点. 多叉树:(multiway tree)允许每个节点有更多的数据项和更多的子节点.在多叉树中,节点的数据项是按关键字升序排列. A1: 2-3-4树就是多叉树,它的每个节点最多有3个数据项和4个子节点. 2-3-4树中的2.3.4的含义是指一个节点可能包含的子节点的个数. 对非叶节点有三种可能的情况: 1) 有1个数据项的节点总是有2个子节点 2) 有2…
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private int end; private int number; private int max; private Queqe(int maxsize){ array = new int[maxsize]; max = maxsize; front = 0; end = 0; number = 0; } pri…
Java数据结构和算法(一)散列表 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 散列表(Hash table) 也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做 散列函数 ,存放记录的数组叫做 散列表. 数组的特点是:寻址容易,插入和删除困难: 链表的特点是:寻址困难,插入和删除容易. 散列表的特点是:结…
Java数据结构和算法(七)B+ 树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 我们都知道二叉查找树的查找的时间复杂度是 O(logN),其查找效率已经足够高了,那为什么还有 B 树和 B+ 树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?答案当然不是, B 树和 B+ 树的出现是因为另外一个问题,那就是磁盘 IO. 一.计算机中数据的存储原理 页是计算机管理存储的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割…
Java数据结构和算法(五)二叉排序树(BST) 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 二叉排序树的左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,因此若按按中序遍历则从小到大的排序 二叉排序树在搜索中的应用非常广泛,同时二叉排序树的一个变种(红黑树)是 java 中 TreeM…