![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
Jeff_
面向Google和StackOverflow编程的小学生。
展开
-
动态规划 Dynamic programming
文章目录一、前言二、优点三、引申1. [coin-change](https://leetcode.com/problems/coin-change/solution/) 换零钱问题2. [Minimum Path Sum](https://leetcode.com/problems/minimum-path-sum/) 最小路径问题3. [Partition Equal Subset Sum](https://leetcode.com/problems/partition-equal-subset-sum原创 2020-09-13 15:17:13 · 1660 阅读 · 0 评论 -
辗转相除法(Euclidean algorithm / 欧几里得算法)
在数学中,辗转相除法,又称欧几里得算法(英語:Euclidean algorithm),是求最大公约数的算法。两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。例如,252和105的最大公约数是21(252=21*12;105=21*5);因为 252 − 105 = 21 × (12 − 5) = ...翻译 2020-03-21 16:08:45 · 4465 阅读 · 0 评论 -
Compare-and-swap(CAS无锁算法)
锁的优缺锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。操作系统对多线程的锁进行判断就像两姐妹在为一个玩具在争吵,然后操作系统就是能决定他们谁能拿到玩具的父母,这是很慢的。用户态的锁虽然避免了...翻译 2020-03-08 23:08:12 · 4197 阅读 · 0 评论 -
Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法
缓存是一个计算机思维,对于重复的计算,缓存其结果,下次再算这个任务的时候,不去真正的计算,而是直接返回结果,能加快处理速度。当然有些会随时间改变的东西,缓存会失效,得重新计算。在计算中,缓存算法(通常也称为缓存替换算法或缓存替换策略)是优化指令或算法,计算机程序或硬件维护的结构可以利用这些指令或算法来管理存储在计算机上的信息缓存。高速缓存通过将最近或经常使用的数据项保存在比普通内存存储区更快或更...原创 2020-03-08 21:36:49 · 11745 阅读 · 0 评论 -
Skip List(跳表)
转载自:lotabout.me正文跳表(skip list) 对标的是平衡树(AVL Tree),是一种 插入/删除/搜索 都是 O(log n) 的数据结构。它最大的优势是原理简单、容易实现、方便扩展、效率更高。因此在一些热门的项目里用来替代平衡树,如 redis, leveldb 等。跳表的基本思想首先,跳表处理的是有序的链表(一般是双向链表,下图未表示双向),如下:这个链表中,如...转载 2020-03-07 19:28:51 · 523 阅读 · 0 评论 -
Bit Tricks (位运算技巧)
技巧? 是的,你没有看错!聪明的程序员总是喜欢这种东西。一点点让我的生活变得如此轻松,以至于我总是喜欢谈论它们!如果您不熟悉它或感到困难,那么不用担心,您来对地方了!本文旨在使您的旅途更轻松。相信我,您一定会喜欢这篇文章。因此,让我们开始吧!位?这些是什么?好吧,对于某些人来说,它是0和1,即二进制数字。直到一天以前,我都一直有这种感觉,我们的一位教授告诉我们,他们具有特殊的含义。二进制数字0...翻译 2020-02-26 22:55:43 · 343 阅读 · 0 评论 -
代码的抽象三原则
软件开发是"抽象化"原则(Abstraction)的一种体现。所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化"应该遵循的三个原则,觉得很有启发。一、DRY原则DRY是 Don’t repeat yourself 的缩写,意思是"不要重复自己"。软件工程名著《The Prag...转载 2020-02-14 19:13:09 · 554 阅读 · 0 评论 -
表驱动法(Table-Driven Methods)
背景表驱动方法是一种方案,它允许您在表中查找信息,而不是使用逻辑语句(if和 case)来查明信息。实际上,您可以使用逻辑语句选择的任何内容,都可以使用表进行选择。在简单情况下,逻辑语句更容易,更直接。随着逻辑链变得越来越复杂,表格变得越来越有吸引力。当使用表驱动方法时,必须解决两个问题。首先,您必须解决如何在表中查找条目的问题。您可以使用一些数据直接访问表。例如,如果您需要按月对数据进行分类...原创 2020-01-18 13:10:53 · 7920 阅读 · 1 评论 -
零拷贝( Zero-copy )
一、背景“零拷贝” 描述了计算机操作,其中CPU 不执行将数据从 一个存储区 复制到 另一个存储区 的任务。通过网络传输文件时,通常用于节省CPU周期和内存带宽。在传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果...原创 2020-01-11 19:07:44 · 908 阅读 · 0 评论 -
AOP(Aspect-oriented programming,面向切面编程)
概述面向切面的程序设计(Aspect-oriented programming,AOP)是CS计算机科学中的一种程序设计泛型,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。其可以通过预编译方式和运行期动态代理实现在不修改源码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可...翻译 2020-02-04 16:46:03 · 1690 阅读 · 0 评论 -
死锁产生的条件及其如何处理
一、原因与条件产生死锁的原因主要是:因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。发生死锁的四个必要条件:相互排斥:所涉及的资源必须不可共享;否则,将不会阻止进程在必要时使用资源。 保留并等待或部分分配:进程在等待其他(请求的)资源时必须保留已分配的资源。如果该进程必须在请求一个或多个新资源时释放其资源,则不会发生死锁,因为该进程不会阻止其他人使用它控制的资源...原创 2019-12-01 23:31:44 · 1920 阅读 · 0 评论 -
贪心算法
贪心算法(英語:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。常见的贪心问题有:海盗分金、行商问题(最短路径问题)简介贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解...原创 2019-11-24 22:45:14 · 642 阅读 · 0 评论 -
Leetcode:Two Sum —— 利用unordered_map特性
unordered_map 是關聯容器,含有帶唯一鍵的鍵-值 pair 。搜索、插入和元素移除擁有平均常數時間複雜度。Given an array of integers, returnindicesof the two numbers such that they add up to a specific target.You may assume that each inpu...原创 2019-01-14 15:18:10 · 141 阅读 · 0 评论 -
memoization(记忆化) 计算 fibonacci 数列
原文来自:Sumanth Tambe 博客背景memoization记忆化或memoisation是记忆功能“记住”与某些特定输入相对应的结果。使用记忆输入的后续调用将返回记住的结果而不是重新计算结果。Memoization也被用于其他上下文(以及速度增益以外的目的),例如简单的相互递归下降解析。虽然与缓存有关,但memoization指的是此优化的特定情况,将其与缓存形式(如缓冲或页...翻译 2019-05-11 22:33:21 · 912 阅读 · 0 评论 -
海量数据处理算法—BitMap(Bitmap Sort)
一、背景来源:在Jon Bentley的Programming Pearls一书中,第一列介绍了排序问题。当我们更多地了解问题并清楚地定义它的约束时,解决方案从使用磁盘的合并排序(Merge Sort)转换为更为有效的位图排序(Bitmap Sort)。所谓的Bitmap Sort 就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据...原创 2019-05-11 00:24:45 · 845 阅读 · 0 评论 -
Leetcode 反转链表-Reverse Linked List
Reverse a singly linked list.Example:Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULLFollow up:A linked list can be reversed either iteratively or recursiv...原创 2019-04-25 15:46:42 · 155 阅读 · 0 评论 -
C++ std::pair / std :: tuple / std::optional 的用法
leetcode —— Two Sum刷题刷到std::pair和make_pair()函数,记录下用法,做一个原创 2019-02-19 21:14:51 · 3304 阅读 · 0 评论 -
递归和尾递归的区别
以递归方式实现阶乘函数的实现:int recsum(int n) { if (n < 0) return 0; else if(n == 0 || n == 1) return 1; else return n * fact(n - 1);}以尾递归方式实现阶乘函数的实现:int tailrecsum...原创 2019-02-28 20:51:30 · 10354 阅读 · 3 评论 -
KMP算法最浅显理解
角色:甲:abbaabbaaba乙:abbaaba乙对甲说:「帮忙找一下我在你的哪个位置。」甲从头开始与乙一一比较,发现第 7 个字符不匹配。要是在往常,甲会回退到自己的第 2 个字符,乙则回退到自己的开头,然后两人开始重新比较。这样的事情在字符串王国中每天都在上演:不匹配,回退,不匹配,回退,……这里需要使用的就是BF暴力法。这样的时间复杂度是O(n*m),怎么改善呢?...原创 2019-01-15 16:53:10 · 302 阅读 · 0 评论 -
brute force/BF 暴力法查找子字符串
暴力匹配算法BF法就是brute force暴力法,就是在主串里面一个一个字符向后移去查找是否存在需要查找的子字符串。 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。...转载 2019-01-15 11:08:08 · 566 阅读 · 0 评论 -
Set容器,利用set容器特性去重,查重
set容器关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为...原创 2019-01-09 09:29:48 · 4826 阅读 · 1 评论 -
karatsuba大数乘法问题及其高效算法
转载自: iTimeTraveler博客题目编写两个任意位数的大数相乘的程序,给出计算结果。比如:题目描述: 输出两个不超过100位的大整数的乘积。输入: 输入两个大整数,如1234567 和 123输出: 输出乘积,如:151851741或者求 1234567891011121314151617181920 * 201918171615141312111098765...转载 2019-05-11 23:25:24 · 5464 阅读 · 1 评论 -
lambda 表达式——匿名函数 auto i= [ ] () { };
leetcode 的 submission 是收到 IO 速度的影响的……尽管和其他 OJ 网站不同, leetcode 给你提供了完备的代码级的接口,它的测试例仍旧是通过 IO 来读取的,真是让人桑心。明白这一点是因为,我在查看某道题目的最快解时,发现了这么一段代码。平心而论,他的代码并不比我的复杂度要简化多少,然而却比我快10倍以上,我本来百思不得其解,直到我发现了这么一段代码:s...原创 2019-02-20 15:36:41 · 6962 阅读 · 1 评论 -
寻找小数
题目描述:有一个分数a/b,你需要找到数字c在这个数的小数点后第一次出现的位置。输入格式:输入一行,包含三个整数a,b,c输出格式:输出一个整数,如果不存在c,输出-1样例输入:1 2 0样例输出:2约定:1<=a<b<=105,0<=c<=9#include<iostream>using...原创 2018-11-12 10:14:43 · 247 阅读 · 0 评论 -
希尔排序
希尔排序希尔排序算法既有着悠久的历史,同时也仍然不失活力。该算法的别致之处在于它不再是将输入视作为一个一维的序列,而是将其视作为一个二维的矩阵,并且试图对矩阵的每一列分别进行排序。如果矩阵当前的宽度为w,那么我们就将所有这w列各自的排序总称为w-sorting。实际上每一次Shellsort排序的过程都是由若干个宽度不同的W-sorting构成的,如果矩阵的每一列都已经过排序我们就称之为w...原创 2019-09-01 22:46:20 · 2636 阅读 · 2 评论 -
桶排序 / 计数排序
在这里既然考虑的只是英文字母,所以各元素的取值无非26种可能,因此我们只需将表长M取作为26,并相应的建立这样一个散列表。而其中的各个桶单元呢,则依次对应于abc一直到z这26个字母。在建立了这样一个散列表之后,我们的第一项任务就是来填充名为count的这一行。顾名思义 其中的每一个元素都是一个计数器,分别记录其所对应的那个字母,在输入序列中所出现的次数。比如,这个2就意味着对应的字母...原创 2019-08-17 20:58:10 · 205 阅读 · 0 评论 -
字符串匹配的Boyer-Moore算法(BM算法)
下面引用阮一峰先生在《字符串匹配的Boyer-Moore算法》博文中的图片进行分析讲解背景在计算机科学中,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授设计于1977年。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间...原创 2019-08-11 23:21:35 · 1186 阅读 · 0 评论 -
Karp-Rabin算法()不完备定理
哥德尔不完全性定理哥德尔的不完备性定理是数学逻辑的两个定理,它们证明了每个能够建模基本算术的正式公里系统的固有局限性。这些结果由KurtGödel于1931年出版,在数学逻辑和数学哲学都很重要。这些定理被广泛地,但不是普遍地解释为表明希尔伯特为所有数学找到完整一致的公里集的程序是不可能的。第一定理第一个不完备性定理指出,没有一致的公理系统,其定理可以通过有效的程序(即算法)列出,能够证...原创 2019-08-17 00:31:33 · 627 阅读 · 0 评论 -
使用SIMD(单指令流多数据流)技术来提高程序性能
背景单指令流多数据流(英语:Single Instruction Multiple Data,縮寫:SIMD)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。在微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元,例如Intel的MMX或SSE,以及AMD的3D Now!指令集。图形处理器...原创 2019-07-21 10:07:15 · 4203 阅读 · 0 评论 -
图中矩阵/反置矩阵的相关知识
基本概念矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:这m×n 个数称为矩阵A的元素,简称为元,数位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数为(i,j)元的矩阵可记为()或,m×n矩阵A也记作。元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列...原创 2019-07-03 23:54:54 · 1438 阅读 · 0 评论 -
不用if比较两个数大小
方法1:取平均值法大的为 ((a+b)+abs(a-b)) / 2小的为 (a+b - abs(a-b)) / 2int fMax1(int a, int b) { return ((a+b)+abs(a-b)) / 2; } 方法2:取平均值法(不使用abs())a<b时,a/b=0,所以前面为b*(b/a),后面为b/a,那么结果就是...转载 2019-06-22 22:44:28 · 3885 阅读 · 0 评论 -
洗牌算法(Fisher-Yates Shuffle)
1938年,Ronald Fisher 和 Frank Yates在《Statistical tables for biological》书中首次提出The Fisher–Yates shuffle。1964年,Richard Durstenfeld 和Donald E. Knuth在《The Art of Computer Programming》书中 "Algorithm P (Shuf...原创 2019-05-12 12:32:27 · 1063 阅读 · 0 评论 -
String 字符串成员函数
string::append:通过在其当前值的末尾附加其他字符来扩展字符串(其他字符串可以截取中间一段) string::assign:为字符串分配一个新值,替换其当前内容 string::at:获取字符串中的字符,返回对字符串中pos位置的字符的引用(异常抛出) string::back:对字符串中最后一个字符的引用(可以对最后一个字符替换) string::begin:将迭代器返回到开...原创 2019-01-24 14:17:59 · 485 阅读 · 0 评论 -
Leetcode:28. Implement strStr() —— KMP算法
Implement strStr().Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.Example 1:Input: haystack = "hello", needle = "ll"Output: 2Examp...转载 2019-01-14 12:46:40 · 124 阅读 · 0 评论 -
前缀、中缀、后缀表达式(逆波兰表达式)
中缀表达式简介中缀表达式就是常见的运算表达式,如(3+4)×5-6前缀表达式简介前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前比如:- × + 3 4 5 6前缀表达式的计算机求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式...转载 2018-11-04 21:40:37 · 560 阅读 · 0 评论 -
约瑟夫环
转载自:https://www.cnblogs.com/daimingming/p/3242406.html问题描述:已知n个人(以编号0,2,3...n-1分别表示)围坐在一起。从编号为0的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,最后一个出列的人为胜利者。求胜利者编号.历史背景:Wikipedi...转载 2018-09-28 11:04:25 · 184 阅读 · 0 评论 -
数组-约瑟夫环
题目描述:已知有n个人围坐在一张圆桌上,编号依次为0,1,2,...n-1, 编号为n-1与编号为0的人坐在相邻的位置。现在编号为k的人从1开始报数,数到m的那个人会退出圆桌。他的下一个人又从1开始报数,数到m的那个人又出列。依此规律重复下去,请问最后出列的人的编号。输入格式:输入一行,包含三个整数n,k,m输出格式:输出一行,包含一个整数#include<iost...原创 2018-09-28 10:56:55 · 443 阅读 · 0 评论 -
Two Sum 找出数组内两个数相加和为n的下标
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same ...原创 2018-11-20 10:19:42 · 1019 阅读 · 1 评论 -
约瑟夫环
圆桌旁的人都坐着。 它们标有0,1,2 ... n-1,数字n-1位于数字为0的数字附近。它们按照以下规则进行游戏。 他们从数量为k的人开始计算。 他们将他/她统计为1,然后坐在他/她旁边的人被计为2,依此类推。 这个过程一直持续到他们发现谁被算作m并且他们将退出圆桌会议。 下一个人再次从1开始计算。 一旦计数再次达到m,该人再次退出。 这个过程一遍又一遍地重复,直到桌子上有一个人坐着。 打印出最...原创 2018-11-23 19:06:09 · 123 阅读 · 0 评论 -
练习题:求使得 x²+S(x)*x-n=0等式成立的x值,n值是输入
有这样一个式子 x²+S(x)*x-n=0,x,n都是正整数,S(x)为x所有十进制位的和。现在给你一个n,你需要找到最小的x使等式成立。输入格式:输入一个整数 n输出格式:输出一个整数,如果不存在一个整数使等式成立,输出-1。#include <iostream>int sum(int a );int main(){ using namespace std;...原创 2018-08-23 14:23:54 · 770 阅读 · 0 评论