数据结构与算法
文章平均质量分 60
Paul-LangJun
凡事预则立,不预则废。
展开
-
快速方阵幂算法
一、问题描述 给定一个方阵,求方阵的次幂,例如,。二、简单算法实现 解决该问题的一个直接想法是利用for循环不断进行方阵乘法,直到求出,算法时间复杂度是,如此高的时间复杂度在实践中是走不通的。三、快速算法实现 下面是用python实现的方阵的快速实现,关键代码处已经给出了注释。从算法上看,右移一位最多执行 次就会变成 0,故该算法的时间复杂度是,表示方阵的行数或列数,基本思想是重复利用子问题的解,减少重复计算。# !/...原创 2021-04-26 15:35:10 · 549 阅读 · 3 评论 -
python实现循环双端队列
import mathclass CircularDeque(object): def __init__(self, k): """ Initialize your data structure here. Set the size of the deque to be k. :type k: int """ self.queue = [None] * k self.head = 0 .原创 2021-01-11 13:56:14 · 252 阅读 · 1 评论 -
python速率控制器
最近有空和同事共同开发了一个基于python的速率控制器,可以控制数据的处理速度,在很多场景中相信都会用到,故在此分享给大家。一、代码 主要思想:控制一段时间内处理数据的速度,速度不能超过设定的speed值。例如,speed值设定为100,那就是说每秒数据处理的速度上限是100.#coding=utf-8import timeimport datetimefrom time import sleepclass SpeedControl(object): def _...原创 2020-11-20 18:26:41 · 2182 阅读 · 0 评论 -
LeetCode合并K个升序链表(python版)
一、描述 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得...原创 2020-10-29 22:30:33 · 390 阅读 · 0 评论 -
通俗理解EM算法
如果使用基于最大似然估计的模型,模型中存在隐变量,就要用EM算法做参数估计。个人认为,理解EM算法背后的idea,远比看懂它的数学推导重要。idea会让你有一个直观的感受,从而明白算法的合理性,数学推导只是将这种合理性用更加严谨的语言表达出来而已。打个比方,一个梨很甜,用数学的语言可以表述为糖分含量90%,但只有亲自咬一口,你才能真正感觉到这个梨有多甜,也才能真正理解数学上的90%的糖分究竟是怎么样的。如果EM是个梨,本文的目的就是带领大家咬一口。001、一个非常简单的例子假设现在有两枚硬..转载 2020-05-15 14:00:58 · 233 阅读 · 0 评论 -
矩阵乘法的优化
本文转载在矩阵乘法的优化,其文概要思想便是利用缓存命中率和程序的局部性原理来优化两个矩阵之间的乘法。原文内容如下。代码部分的正确性没有亲自验证。 矩阵乘法的定义是十分简单的,如果按照数学上的定义,可以写出下面的程序: 从计算机专业的角度来看,上面的代码是幼稚的。主要表现在:B[k][j]读取内存中的数据,是不连续的。在最底层的循环中,随着k不断加1,B[k][j...转载 2020-03-01 17:29:26 · 9212 阅读 · 11 评论 -
对误差反向传播的理解和学习
关于反向传播,我非常推荐下面的一个在线书籍,其给出了非常详实、生动且易于理解的反向传播算法以及相关公式的推导,链接为:Neural Networks and Deep Learning。本文将对其讲解给以归纳和总结,其中不乏添加一些个人见解。 本文将使用如下图所示神经网络进行推导。一、符号假设损失函数为第 层的第 个神经元的偏置为,输入层没有偏置第...原创 2020-02-22 14:14:54 · 1734 阅读 · 0 评论 -
二分查找注意事项及其变形
一、实现public int bsearch(int[] a, int n, int value) { int low = 0; int high = n - 1; while (low <= high) { int mid = (low + high) / 2; if (a[mid] == value) { return mid; }...原创 2020-01-13 13:09:16 · 178 阅读 · 0 评论 -
Python实现两个有序集合的交集和并集
本文通过python实现简易的集合交并算法,输入是两个以递增顺序排序的集合,输出它们的有序交集和有序并集。1、Union算法def union(s1, s2): o = [] i = j = 0 s1_n = len(s1) s2_n = len(s2) while i < s1_n and j < s2_n: ...原创 2020-01-11 21:56:13 · 2939 阅读 · 0 评论 -
理解均摊时间复杂度
均摊时间复杂度分析,又叫摊还分析(或者叫平摊分析)。均摊时间复杂度,听起来跟平均时间复杂度有点儿像。对于初学者来说,这两个概念确实非常容易弄混。大部分情况下,我们并不需要区分最好、最坏、平均三种复杂度。平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。我还是借助一个具体的例子来理解。 // array表示一个长度为n的数组 // 代码中...原创 2019-12-26 15:28:45 · 3968 阅读 · 0 评论 -
C++ STL Deque源码阅读纪要
一、deque是什么 deque是双向队列,队头和队尾都能进行插入和删除,这是与vector不同之处之一。另外与vector的一点不同之处是deque的内存由分段连续空间组成,没有容量的概念,即没有vector在需要扩容时进行的开辟新数组、复制旧数据、清空旧数组的三部曲之说。其内存结构如下图。 如图,deque的内存由两部分构成,第一部分是一个由指针构成的map数组,第二部...原创 2019-12-23 16:14:25 · 171 阅读 · 0 评论 -
Redis精彩文章收录
Redis的hmget操作复杂度问题。https://neway6655.github.io/redis/2016/10/10/redis-hmget-deep-study.html Redis内存优化实践。https://neway6655.github.io/redis/2016/07/19/redis-memory-optimization-in-practice.html 善待R...原创 2019-11-26 14:26:25 · 91 阅读 · 0 评论 -
栈的应用:中缀表达式和后缀表达式互转
一、概要 中缀表达式是我们经常接触的算术表达式,如(a+b)* c,a * (c - d)等,优点是便于记忆,缺点是对运算顺序有严格的要求。后缀表达式又称逆波兰式,如abc*+d e *f+g*+,虽然不便记忆,但是它不像中缀表达式,对于运算的顺序是没有要求,可以按照顺序扫描的方法计算表达式,因此在计算机内部容易用编程的方式实现表达式的求值。二、中缀转后缀# !/u...原创 2019-11-19 18:19:34 · 409 阅读 · 0 评论 -
牛顿法的收敛速度为何比梯度下降法快?
原文链接: 牛顿法 从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长...转载 2019-11-08 14:18:24 · 2552 阅读 · 0 评论 -
算法设计与编写技巧
关于算法方面的技巧,本文将从设计和编写两个角度分别进行总结,这些技巧是本人在解决一些算法问题时总结出的一些经验,后续会不断补充,欢迎感兴趣的朋友多提宝贵意见。一、编写技巧为实现一个数a除以2,向右移位比 a / 2 高明且有效的多。a >> 1 优于 a / 2。注意 a 需是整形。 在编写一些简单循环的代码时,考虑是否可以利用 “哨兵”,减少一些不必要的判断,增...原创 2019-10-17 10:34:33 · 1582 阅读 · 0 评论 -
双线程实现超大型3000*3000矩阵的转置
import java.util.Random;//主类public class Root { public static int time = 0; public static void main(String[] args) throws InterruptedException { // 矩阵的行列数目 final int ROW_NUM = 30原创 2013-11-22 23:14:43 · 978 阅读 · 0 评论 -
基于快速排序的O(N)时间复杂度的TopK算法原理
一、背景 实际应用中,我们经常面临这样的问题,即从一个序列S中选择其中最大的K个数(一般情况下K远小于|S|),我们将这种问题称为TopK问题。 举一个例子,美剧《权利的游戏》中的每个人物,观众都会对其进行选择支持或不支持,这样每个人物都会都应一个热度值,这个值可以是支持者的数量,我们可以发现在腾讯视频中该剧中热度排名前3的人物加以了高亮标识,如下图:...原创 2019-04-19 22:47:46 · 3930 阅读 · 0 评论 -
快速排序的稳定性分析
快速排序是一个不稳定的排序算法,本文将着重分析该算法不稳定的原因所在。 首先,考虑下图中对一个关键字都为 1 的序列所进行的交换操作。 如图,交换前,枢纽元已放置在最后一个位置。图中,当遇到和枢纽元大小相同的元素时,游标 选择继续前进,直到与游标 相遇为止,然后将枢纽元与游标 和 所指向的元素交换,再递归的对左右两边的数...原创 2019-04-20 11:39:05 · 20422 阅读 · 6 评论 -
关于希尔排序的一些思考
一、基本思想 希尔排序是冲破2次时间界的算法之一,它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到仅比较相邻元素的最后一趟为止,鉴于此,希尔排序也叫做 缩小增量排序。二、希尔排序流程图示 算法伪代码就不复制粘贴了,一是因为网上的资源较多,二是不够直观。下图展示了在只有8个整数的数组上执行希尔排序的每一趟的过程。...原创 2019-05-27 14:33:01 · 385 阅读 · 0 评论 -
最大子序列和问题求解与分析
一、问题描述 最大子序列和问题是要在 个数中寻找一个子序列和,该子序列和是所有个数中选择的子序列中的最大值。形式化为: , ...原创 2019-06-24 09:27:29 · 361 阅读 · 0 评论 -
求A^{-1}B的快速方法
在机器学习的文章中,经常碰到 的情况,本文给出在 和 满足一定条件下如何应用更加高效的方法求解。 假定 为可逆 矩阵, 为 矩阵,则 可由如下的行化简求得 由此可推出两个结论: (1) (2...原创 2019-07-24 11:39:10 · 704 阅读 · 0 评论 -
论枢纽元的选择方式对快速排序性能的影响
枢纽元的选择需要结合待排序数据的具体形态而定,如数据是否排序,是逆序还是正序等,下表对各种数据形态下的枢纽元选择进行了总结。 不同数据形态下枢纽元的选择对比 首元素 前两个互异关键字中的较大者 随机元素 所有关键字的...原创 2019-08-21 17:24:51 · 277 阅读 · 0 评论 -
关于矩阵乘法运算顺序上的技巧
如果存在A, B, C三个矩阵,其中 B 为方阵,且 C 的列数较 A 的行数少时,则计算 A(BC) 比(AB)C 更省算力。 分析: 若假定HOR(A) = 100,COL(C) = 50,HOR(B) = COL(B) = N, 则 A(BC) 的计算量为: HOR(A) * COL(BC) +...原创 2019-04-12 18:16:34 · 6863 阅读 · 0 评论 -
排序 —— 插入排序、选择排序与冒泡排序
一、插入排序 对含有 个元素的数组 进行 次遍历,第 次遍历将元素 插入到位置区间 中合适的位置上。# !/usr/bin/python# coding=utf-8def insert_sort(a): loop_num = len(a) - 1 if loop_num == -1: return for i in rang...原创 2019-04-01 09:47:53 · 101 阅读 · 0 评论 -
快速排序
#include<iostream>#define CUTOFF 10 // 定义快速排序的数组规模下界// 交换两个整数void swap(int *fir, int *sec) { int temp = 0; temp = *fir; *fir = *sec; *sec = temp;}// 插入排序算法void InsertionSort(int A[...原创 2015-07-06 19:21:22 · 875 阅读 · 0 评论 -
创建堆
课题----创建优先队列 堆又称之为优先队列,其用途非常广泛,我们可以通过数组实现堆的存储。堆有一条很重要的性质,即堆中任一颗子树的根节点的值总是小于或等于其任一个儿子的节点值(前提是其存在儿子)。 堆存在诸多操作,如建堆,删除根,插入节点,合并堆等。其中建立堆是最基础的操作,在此,通过c++实现堆的建立。#include using namespace std;#define LE原创 2015-03-30 11:16:09 · 533 阅读 · 0 评论 -
O(n*lgn)时间复杂度的逆序对统计算法实现思想
逆序对定义:设A[1..n]是一个包含n个不同数的数组。如果在i A[j],则(i,j)就称为A中的一个逆序对(inversion)。现给出一个算法,其可以用O(n*lgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数量。简单的算法实现思想:我们可以单纯的通过从前往后的逐一比对来确定逆序对的数量,虽然实现简单,但这样一来时间复杂度将会上升为O(n*n),不符合我们的要求。原创 2015-03-28 17:06:05 · 1885 阅读 · 0 评论 -
一个很好的动态规划入门案例
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!----第一节----初识动态原创 2022-02-17 15:19:03 · 1498 阅读 · 5 评论 -
大数存储
/**挑战类型表示的极限解决思路: 用一个数组存储一个大数,每个数组元素存储大数中的一位数字,然后采用逐位相乘,后位向前进位的方法计算大数的阶乘值只要数组长度定义的足够大,就可以计算足够大的数的阶乘值。*/#include#include#define SIZE 51int main(){int data[SIZE] = {0};/* 存储50位数,元素全部原创 2014-09-20 19:01:31 · 2113 阅读 · 3 评论 -
程序实现搜索迷宫出口完整版
import java.awt.*;import java.awt.List;import java.awt.event.*;import java.util.*;import javax.swing.JOptionPane;//驱动类public class tanchishe { public static void main(String[] args)原创 2013-01-26 12:19:37 · 1269 阅读 · 0 评论 -
简单的词法分析程序
//入口类import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.原创 2013-07-27 20:34:52 · 787 阅读 · 0 评论 -
堆栈分析
目录数据结构与操作系统中的堆栈对比堆和栈的区别一、预备知识—程序的内存分配二、例子程序堆和栈的理论知识1.申请方式2.申请后系统的响应3.申请大小的限制4.申请效率的比较5.堆和栈中的存储内容6.存取效率的比较7.小结:堆和栈的主要分别:补充展开数据结构与操作系统中的堆栈对比 堆和栈的区别 一、预备知识—程序的内存分配 二、例子程序堆原创 2013-04-26 21:36:35 · 781 阅读 · 0 评论 -
如何实现在遍历集合的过程中删除其中的元素
有时我们迫于需要,我们要在遍历集合的过程中删除符合某种条件的元素,但常常无法有效的删除。主要原因在于通常我们遍历集合时习惯从集合的第一个元素开始遍历,如此一来在删除其中某些元素时变改变了游标的正确位置,所以我们要反其道而行之,从后往前遍历,问题也就迎刃而解。原创 2015-08-26 19:51:29 · 1314 阅读 · 0 评论 -
生成一定数目的排列
设 S = {x1, x2, x3, .... , xn} 为一个n元正整数集合: y = (a * x + b) mod n 为排列的一个生成函数,其中 a 与 n 互素,并且a, b取值于S中, b的取值任意且个数为 |S| 个 . 那么任取S中与n互素的一个数并赋值与a, 设与n互素的数有m个, 那么符合条件的a与b的组合数有m * | S | 个 . 任取原创 2015-10-09 18:06:45 · 411 阅读 · 0 评论 -
DBSCAN算法
注:调用该算法时,需要将SetOfPoints设为全局变量并在用到该变量时需要显式的声明。% 算法描述% 基于密度的聚类算法% 参数% Eps: 一个阈值,表示以某个样本点为圆心所形成的圆的半径% MinPts: 一个阈值,表示以某个样本点为圆心以Eps为半径所形成的圆内至少要包含的点的数目% 返回值% void% 注示:% -1 表示未分类标号% 0原创 2015-11-28 21:06:11 · 616 阅读 · 0 评论 -
通信协议之序列化
转载地址:blog.chinaunix.net/uid-27105712-id-3266286.html 通信协议之序列化 通信协议可以理解两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。常见的有tcp,udo,http,sip等常见协议。协议有流程规范和编码规范。流程如呼叫流程等信令流程,编码规范规定所有信令...转载 2018-08-02 08:36:38 · 821 阅读 · 0 评论 -
Linux:高效编写shell脚本的10个建议
转载地址: https://mp.weixin.qq.com/s/YmROxFBkfMxuh_VaaI4wtg 【Linux命令】 linux下高效编写shell脚本的10个建议 在Linux环境下工作 ,shell脚本的编写应该是一个必备的基本技能了,本文将分享 10 个写出高效可靠的 shell脚本的实用技巧本文主要内容来源于《10 Useful Tips for Writ...转载 2018-08-01 14:16:18 · 602 阅读 · 0 评论 -
算法: 算法复杂度速查表
转载地址: https://mp.weixin.qq.com/s/Buigu5jNYP5vUExJ3cUVhA 今天看到一篇英文文章,总结了计算机科学里面常见算法的时间和空间的big-o复杂度。联想到之前在参加面试时,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家初创企业和一些更大一些的公司,如BAT、TMD,每次我都需要准备...转载 2018-08-01 14:09:10 · 453 阅读 · 0 评论 -
算法: BFPRT(线性查找算法)
转载地址: https://mp.weixin.qq.com/s/U70cJ0fKpcjiDOe0ZeBS2w BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。...转载 2018-08-01 14:03:19 · 335 阅读 · 0 评论 -
算法: Boyer-Moore字符串匹配算法
Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。下面,我根据Moore教授自己的例子来解释这种算法。1.假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。2.首先,"字符串"与"搜索词"头部对齐,从尾...转载 2018-08-01 13:58:25 · 287 阅读 · 0 评论