时间复杂度

LeetCode 136. 只出现一次的数字 java

≯℡__Kan透↙ 提交于 2019-11-29 06:07:25
LeetCode 136. 只出现一次的数字 java 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 JAVA 代码: class Solution { public int singleNumber(int[] nums) { int n = nums.length; int i, v = 0; for (i = 0; i < n; i++) { v ^= nums[i]; } return v; } } 来源: CSDN 作者: Owen_le 链接: https://blog.csdn.net/z740852294/article/details/86470201

JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

£可爱£侵袭症+ 提交于 2019-11-29 05:59:46
1. 前言 算法为王。 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远 。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。 之所以把 计数排序、桶排序、基数排序 放在一起比较,是因为它们的平均时间复杂度都为 O(n) 。 因为这三个排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作 线性排序 (Linear sort)。 之所以能做到线性的时间复杂度,主要原因是,这三个算法不是基于比较的排序算法,都不涉及元素之间的比较操作。 另外,请大家带着问题来阅读下文,问题:如何根据年龄给 100 万用户排序 ? 2. 桶排序(Bucket Sort) 桶排序是计数排序的升级版,也采用了 分治思想 。 思想 将要排序的数据分到有限数量的几个有序的桶里。 每个桶里的数据再单独进行排序(一般用插入排序或者快速排序)。 桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 比如: 桶排序利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量。 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。 桶排序的核心:就在于怎么把元素平均分配到每个桶里

数据结构之绪论

旧街凉风 提交于 2019-11-29 05:03:32
基本概念 数据: 数据 是对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机程序处理的符号的总称。数据的含义很广泛,如图像、声音等都可以通过编码而归之为数据的范畴。 数据元素:(行)(元组)(记录) 数据元素 是数据的 基本单位 ,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可包含多个数据项。 数据项 是数据的不可分割的 最小单位 。如把一本书看成一个数据元素,则可把书名、作者名,看成这个数据元素包含的两个数据项。 数据对象:(表) 数据对象是性质相同的数据元素的集合,是数据的一个子集。如整形数据对象是集合 N={0,+-1,+-2......}。 数据类型: 原子类型: 其值不可再分的数据类型。如整形、字符型、枚举类型、空类型。 结构类型: 其值可以再分解为若干成分(分量)的数据类型。 抽象数据类型: 抽象数据组织及与之相关的操作。 抽象数据类型:(Abstract Data Type) 抽象数据类型(ADT) 是指一个数学模型及定义在该模型上的一组操作, 仅取决于 它的一组逻辑特性。通常用 (数据对象、数据关系、基本操作集) 这样的三元组来表示抽象数据类型。 数据结构:(数据结构=数据元素+数据关系) 数据结构 是相互之间存在一种或多种特定关系的数据元素的集合。数据元素不是孤立存在的,数据元素相互之间的关系称为 结构 。包括三个方面的内容

时间复杂度

不羁岁月 提交于 2019-11-29 04:10:02
o(1),容器数据量的大小不影响查询效率,比如ArrayList根据下标获取值。 o(n),容器数据量越大查询效率越低,比如LinkedList根据下标取值,需要for循环LinkedList所有元素。 o(logn),最常见的就是二分查找,数据容量增加8倍,查询效率降低3倍,2^3=8。 ArrayList时间复杂度o(1) LinkedList时间复杂度o(n) HashMap时间复杂度分两种情况, 1、如果key的Hashcode运算不与其他key的Hashcode产生碰撞,则不形成链表,时间复杂度为o(1) 2、如果key的Hashcode运算与其他key的Hashcode产生碰撞,则形成链表,时间复杂度为o( ) 来源: https://my.oschina.net/u/3745555/blog/3101099

C++模板学习之优先队列实现

Deadly 提交于 2019-11-29 03:21:31
转载:https://www.cnblogs.com/muzicangcang/p/10579250.html 今天将继续将强C++模板类的学习,同时为了巩固已经学习过的数据结构中有关优先队列的知识,我将会使用模板类来实现自己的优先队列。在给出具体实现之前,我要先介绍一下什么是优先队列,聊以为复习吧。 在某些情况下,我们会收集一些元素,处理当前元素的最大值,然后再收集更多数据,再处理此时的最大值。这就要求我们设计的数据结构能够随时访问元素集合中的最大值和能够随时插入数据。优先队列即可以实现这种功能。 优先队列 优先队列的实现有两种思路,第一是在数据插入时保存数据元素的有序性,这意味着我们能够以O(1)的时间复杂度来访问元素中的最大值。但是我们在数据进行插入的时候,对寻找数据的合适位置的访问操作的最坏时间复杂度为O(N)。第二种思路是构建一个堆,他能够让我们以N(1)的时间复杂度来访问元素中的最大值,而以O(logN)的时间复杂度来调整堆,以便将元素插入到合适的位置。综上所述,在具体实现优先队列的时候需要根据待处理的元素量级来确定到底使用哪种思路。很明显,当数量级较小的时候,适合使用第一种思路;当数量级较大的时候,第二种思路将比较好。 首先简单介绍一下什么是堆。 1、堆是一种数据结构,他是一棵完全二叉树 2、在堆中,每个父节点都大于等于它的两个孩子结点,被称为堆有序 3

字符串匹配算法

眉间皱痕 提交于 2019-11-29 03:14:05
原博地址: https://www.cnblogs.com/Franky-ln/p/5890201.html(字符串匹配算法综述 )。写的很好,特意粘贴过来,转载。非常感谢原作者创作。 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目。此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置。比如原字符串为“ABCDEFG”,子串为“DEF”,则算法返回3。常见的算法包括:BF(Brute Force,暴力检索)、RK(Robin-Karp,哈希检索)、KMP(教科书上最常见算法)、BM(Boyer Moore)、Sunday等,下面详细介绍。 1 BF算法: 暴力检索法是最好想到的算法,也最好实现,在情况简单的情况下可以直接使用: 首先将原字符串和子串左端对齐,逐一比较;如果第一个字符不能匹配,则子串向后移动一位继续比较;如果第一个字符匹配,则继续比较后续字符,直至全部匹配。 时间复杂度:O(MN) 2 RK算法: RK算法是对BF算法的一个改进:在BF算法中,每一个字符都需要进行比较,并且当我们发现首字符匹配时仍然需要比较剩余的所有字符。而在RK算法中,就尝试只进行一次比较来判定两者是否相等。 RK算法也可以进行多模式匹配,在论文查重等实际应用中一般都是使用此算法。 首先计算子串的HASH值

面试题

笑着哭i 提交于 2019-11-29 03:10:57
链表翻转 字符串拷贝 && memcpy &memmove 快排和时间复杂度 字符串中查找字符 string类的实现 堆排序&时间复杂度 智能指针 一个英文文档,计算出现次数是10次的单词 互斥锁 多个字符串,找到前缀相同最多的两个字符串 判断一个点是否在矩阵中 两个玻璃球判断楼高 千万字符串中查找 一片森林,用最短的绳子围起来 strcpy缺陷 vector内存实现机制 hash原理 二叉树,AVL树构成 堆的构成 大数据排序 来源: https://www.cnblogs.com/zhaochunhua12345/p/11441350.html

CDQ分治与整体二分小结

倖福魔咒の 提交于 2019-11-29 02:36:36
前言   这是一波强行总结。   下面是 一波瞎比比。   这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊。   很多很显然的东西都看不出来 分治分不出来 打不出来 调不对   上午下午晚上的效率完全不一样啊。   完蛋.jpg 绝望.jpg。 关于CDQ分治   CDQ分治,求的是三维偏序问题都知道的。   求法呢,就是在分治外面先把一维变成有序   然后分治下去,左边(l,mid)关于右边(mid+1,r)就不存在某一维的逆序了,所以只有两维偏序了。   这个时候来一波"树状数组求逆序对"的操作搞一下二维偏序   就可以把跨过中线的,左边更新右边的情况计算出来。    注意:只计算左边的操作对右边的询问的贡献!   然后左右两边递归处理就好了。   正确性:按照线段树的形态递归的CDQ分治,保证每一对三元组在第一维划分的线段树上都有且仅有一个LCA(这不废话吗),而这一组答案就会且仅会在LCA处计算。如果在LCA下面,点对不在一个work内自然不会计算。如果在LCA上面了,点对就在同一侧,不会互相更新。   复杂度:设一次work的复杂度是f(len),则复杂度是O(f(n)logn)。   一般都在分治里用树状数组,一般的复杂度就是O(nlog 2 n)的。   一般是这样的套路:假设三维偏序分别为a,b,c;   在main函数里保证a递增。  

Leetcode (1) 两数之和 ---python

為{幸葍}努か 提交于 2019-11-29 02:18:21
0、开个博客记录一下学习过程,就这样。 第一次打开力扣,不知道从怎么写代码,怎么执行,鼓捣了半天,终于知道在哪写了。。。(菜的无与伦比不是浪得虚名)一般题目都是定义一个函数,把函数补充完整就可以了。知道这个之后就先随便选了个简单的,写完,执行,报错,改错,执行,报错,,,看了看别人的代码,看不懂。。。算了,我还是从第一题开始吧! 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 看上去不是很难,两次遍历,返回相加结果成立的,几步就写完了。如下: class Solution:   def twoSum(self, num: List[int], target: int) -> List[int]:     for j in range(len(num)-1):   

A1算法性能评价

佐手、 提交于 2019-11-29 00:36:48
文章目录 写在前面的话 算法性能评价 几种常见时间复杂度对比 写在前面的话 文档没有任何商业因素,本着共享的精神进行分享,如有素材侵权,请给我留言; 文档都是自己平时看书或工作中的笔记,观点错误的地方欢迎留言; 算法性能评价 评价算法的性能主要从两个方面进行评价:时间复杂度和空间规模,记录的方式通常用大 O 标记法; 时间复杂度:指算法在最糟糕情况下的操作数量(一条语句作为一个操作单位),间接反应算法的运行时间; 空间规模:算法执行过程中所需要的最大空间需求;算法执行期间所需要的存储空间一般包含: 输入数据所占的空间;如果输入数据规模与问题相关,则不计入空间规模计算; 程序本身所占的空间;代码空间对不同算法来说一般相差不大,和算法无关; 辅助变量所占的空间; 举个例子来求解时间复杂度和空间规模: 例子1:求解 n 阶矩阵相乘的结果 // 计算 n 阶级矩阵的乘积:算法语句 for(int i = 0; i < n; i++) { // 执行 n+1 次 for(int j = 0; j < n ; j++) { // 执行 n*(n+1) 次 c[i][j] = 0; // 执行 n^2 次 for(int k = 0; k < n; k++) // 执行 n^2(n+1)次 c[i][j] = a[i][k]*b[k][j]; // 执行 n^3 次 } } 计算时间复杂度: