数据结构与算法
数据结构与算法
DLANDML
分享一些正在做的项目
目前正在学习机器学习和深度学习相关知识
目前是一名算法工程师。
CV是我研究生阶段的研究课题,开启了我的算法之路。
NLP是工作需要所学,拓展了我的算法思路与视野,使我对CV有了另一层面的认识。
SLAM亦是工作需要所学,拓展了我的算法落地思想,加深了我对理论落地的理解。
展开
-
443. 压缩字符串
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。进阶:你能否仅使用O(1) 空间解决问题?示例 1:输入:["a","a","b","b","c","c","c"]输出:返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]说明:"aa" 被 "a2" 替代。"bb" 被 "b2"...原创 2021-04-02 22:50:50 · 123997 阅读 · 0 评论 -
算法题番外篇之天弃娇子、刷墙、胜者为王
1、题目:小明预进行一场闯关小游戏,一共有n关,每关游戏有a[i]个按钮,其中只有1个是正确按钮且的正确按钮位置是不变(可以记忆,)按到正确按钮继续闯关,按到错误按钮重新返回第一关开始求:小明闯关成功最多需要按按钮的次数。例:输入[2,2,2]输出9public long findMaxButtons(int[] a){ long res=a.length;// for(int i=0;i<a.length;i++){ //第i关要失败a[i]-1次,原创 2021-03-19 11:34:57 · 126221 阅读 · 0 评论 -
图像旋转后传
请点击:图像旋转几何变换几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变原创 2021-02-23 23:15:50 · 128590 阅读 · 0 评论 -
最小缩放整数
题目:给的一个缩放因子p,将d缩放到s,s为满足s*p>=d的最小整数,求s分析:这道题实质是求向上取整。python求解如下:import mathprint(math.ceil(d/p))相关math复习知识:1、math.round() “四舍五入”, 该函数返回的是一个四舍五入后的的整数 d = 3.1415926; d2 = 18.58; d3 = -15.23; d4 = -16.85; ..原创 2021-02-23 22:42:09 · 18139 阅读 · 0 评论 -
旋转图像
题目:顺时针旋转图像给定一个 n×n 的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:...原创 2021-02-23 22:27:16 · 128280 阅读 · 0 评论 -
FFT是如何提高时间复杂度的
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一。我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章中,以看似简单的计算技巧来讲解这个东西。本文的目标是,深入Cooley-Tukey FFT 算法,解释作为其根源的“对称性”,并以一些直观的python代码将其理论转变为实际。我希望这次研究能对这个算法的背景原理有更全面的认识。FFT(快速傅里叶变换)本身就是离散傅里叶变换(Discrete Four.转载 2021-02-20 00:26:25 · 131794 阅读 · 0 评论 -
测试Eigen库中自带的快速傅里叶变换(FFT)
利用Eigen实现矩阵计算非常方便,可以用于大量线性变换(矩阵计算)和快速傅里叶变换(FFT)场所。在实现FFT时,借助了FFTW3库,但二者由于数据类型不同,需要转化,影响计算效率。Eigen+FFTW3的计算需要1.7s,希望进一步提高算法的计算效率。预算尝试Eigen库自带的FFT,相关资料如下:EigenFFTEigen/FFT可以看出,Eigen FFT并不成熟,借助了kissFFT实现的。在stackoverflow网站上找到了参考代码,eigen-fft-library在本原创 2021-02-20 00:11:53 · 130443 阅读 · 2 评论 -
国际象棋走棋步数(Distance on Chessboard)计算程序
国际象棋走棋步数(Distance on Chessboard)计算程序国际象棋的棋盘是黑白相间的8 * 8的方格,棋子放在格子中间。如下图所示:王、后、车、象的走子规则如下:王:横、直、斜都可以走,但每步限走一格。后:横、直、斜都可以走,每步格数不受限制。车:横、竖均可以走,不能斜走,格数不限。象:只能斜走,格数不限。写一个程序,给定起始位置和目标位置,计算王、后、车、象从起始位置走到目标位置所需的最少步数。Input第一行是测试数据的组数t(0 <= t &l...原创 2021-02-19 23:47:57 · 130740 阅读 · 0 评论 -
一点即通快速排序
基本思想:①、选定pivot为中心轴②、将小于pivot的数字放在pivot的左边③、将大于pivot的数字放在pivot的右边④、分别对左右子序列重复①、②、③quickSort(int array[],int L,int R){ if(L>=R):return; int left=L,right=R; int pivot=array[left]; while(left<=right) { while(left&l原创 2020-09-17 16:28:22 · 18407 阅读 · 0 评论 -
螺旋矩阵的实现
什么是螺旋矩阵: 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。实现思路: 根据规律可以看出,每一层都是按照右->下->左->上的顺序进行递增,由此可见可以用列表和递归的方式每一层每一层的实现,直到中间完全剩下一个(奇数行),或者递归实现填满(偶数行)Python代码:def main(): lines = int(input('请输入螺旋矩阵的行数:')) ...原创 2020-08-21 22:05:21 · 781 阅读 · 0 评论 -
概率论中常见分布总结以及python的scipy库使用
两点分布、二项分布、几何分布、泊松分布、均匀分布、指数分布、正态分布...概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布。离散概率分布也称为概率质量函数(probability mass function)。离散概率分布的例子有伯努利分布(Bernoulli distribution)、二项分布(binomial distribution)、泊松分布(Poisson distribution)和几何分布(geometric distribution)等。原创 2020-08-08 12:49:43 · 1028 阅读 · 0 评论 -
三种方法实现PCA降维
记录一下python实现PCA降维的三种方法:1、直接法2、SVD3、Scikit-learn在进行PCA降维中,会涉及到协方差的相关知识:请参考另一篇博文:协方差的理解与python实现import numpy as npfrom sklearn.decomposition import PCAimport sys#returns choosing how many main factorsdef index_lst(lst, component=0, rate=0):.原创 2020-08-08 12:06:38 · 4016 阅读 · 0 评论 -
深度学习之python实现线性代数基础
在进行深度学习的开发中,比如CV方面,经过会用到一些线性代数方面的知识,现在进行罗列一些,方便以后查阅。我们可以使用 help()查看相关方法的使用,比如help(np.allclose) 查看 allclose() 的用法。1、矩阵创建矩阵创建有两种方法,一是使用np.mat函数或者np.matrix函数,二是使用数组代替矩阵,实际上官方文档建议我们使用二维数组代替矩阵来进行矩阵运算;因为二维数组用得较多,而且基本可取代矩阵。矩阵的创建还包括一些常用的特殊矩阵的创建:import nump原创 2020-08-08 10:25:53 · 27725 阅读 · 0 评论 -
矩阵 维度 axis
python numpy tenforflow中维度的概念是什么呢?怎么用python语言来表示维度呢?我们在利用深度学习进行目标检测的过程中,经过会进行批量图片的处理,常见格式为(batchsize,size,size,channel)四维的矩阵。或者yolo3 backbone输出的矩阵(batch,feature_map_size,feature_map_size,anchor_num,(xmin,ymin,xmax,ymax,socre,class1,...,classn))等。在处理过程中原创 2020-08-08 12:38:16 · 5372 阅读 · 0 评论 -
算法题基础知识汇总
https://www.nowcoder.com/questionTerminal/7fac27044cf849a9a375867280638511 子串长度https://www.cnblogs.com/niuchunyu/p/9644384.html 字符串pythonhttps://blog.csdn.net/qq39221093/article/details/51168557字符串的while()循环遍历http://www.cocoachina.com/articles/895083 ..原创 2021-02-14 11:48:56 · 134101 阅读 · 0 评论 -
全排列
题目:给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]分析:利用树形结构 枚举出所有可行解集合,然后利用剪枝方法 得到符合某一约束规则的可行解。 利用回溯法实现。回溯法的基本思想是先递归,然后回溯,当回溯到树形结构中的某一节点时,代码是如何记住每一步索引的呢?个人理解是因为递归是利用栈分配空间的,所以每一次回...原创 2021-02-14 12:06:19 · 191 阅读 · 0 评论 -
无重复字符最长子串
题目描述:给定一个字符串,找出不含有重复字符的最长子串的长度。示例:给定"abcabcbb",没有重复字符的最长子串是"abc",那么长度就是3。给定"bbbbb",最长的子串就是"b",长度是1。给定"pwwkew",最长子串是"wke",长度是3。请注意答案必须是一个子串,"pwke"是子序列而不是子串#include <string.h>#include <stdio.h>#include <ios...原创 2021-02-12 21:31:53 · 116153 阅读 · 0 评论 -
特大背包问题
题目:特大背包问题 (20分)C时间限制:1000 毫秒 | C内存限制:10000 Kb题目内容:现在有一个容量为C的背包和N个重量和价值已知的物品. 现在要从这n个物品中挑选出一些物品, 使得选择的物品的总重量不超过背包的容量, 且总价值最大.此题的数据范围:1 <= C <= 10^8(10的8次方)1 <= N <= 100输入描述有多组测试数据. 第一行一个正整数T(T<=15), 表示测试数据组数.对于每组测试数据:第一行两个正整数N和C,原创 2021-02-11 21:04:29 · 135090 阅读 · 0 评论 -
斐波那契数列
写一个函数,输入n,求斐波那契数列(Fibonacci)的第n项,如果采用下面自上而下写法,则效率是非常低的,因为会有很多重复的操作long long Fabonacci(unsigned int n){ if(n<=0)return 0; if(n==1)return 1; return Fibonacci(n-1)+Fibonacci(n-2);}一般采用下面的自下而上写法long long Fibonacci(unsigned int n.原创 2021-02-09 22:33:45 · 132891 阅读 · 0 评论 -
员工年龄排序
题目:某公司有几万名员工,每个员工的年龄不超过三位数,请对这些员工的年龄进行排序,要求其时间效率为o(n),可以使用辅助空间void SortAges(int ages[],int length){ if(ages==nullprt||length<0)//边界值返回 return 0; //开辟新内存,存储年龄出现次数,并赋初值=0 const int oldestAge=99; int timesOfAge[oldestAge+1.原创 2021-02-09 13:27:12 · 117212 阅读 · 0 评论 -
快排
快排的关键在于现在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动到数组的左边,比选择的数字大的数字移动到数组的右边。int Partition(int data[],int length,int start,int end){ if(data==nullptr||length<=0||start<0||end>=length) throw new std::exception("invalid parametres");原创 2021-02-07 22:17:41 · 134771 阅读 · 0 评论 -
旋转数组最小数字
题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例:数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1.分析:1)旋转之后的数组可以划分为两个排序的子数组,而且前面子数组的元素都大于后等于后面子数组的元素。2)最小的元素是这两个字数组的分界线。在排序的数组中,可以使用二分查找法(Ologn)3)特例,当两个指针指向的数字及他们中间的数字三者相同的时候,无法判定中间的数.原创 2021-02-05 23:15:07 · 127852 阅读 · 0 评论 -
机器人能走多少个迷宫
题目:地图上有一个m行n列的方格,一个机器人从坐标(0,0)的格子开始移动,它每一次可以移动的方向是上、下、左、右,且每次只能移动一格,但是不能进入行坐标和列坐标数位之和大于K的格子。例子,当K为16时,机器人能够进入方格(24,19),因为2+4+1+9=16,但是不能进入方格(34,28),因为3+4+2+8=17>16,问:该机器人能够达到多少个格子。分析:这个题目比较简单,可以把问题分解为4个部分:1)如何计算数字的位数之和2)机器人是否能够进入某个格子3) 如果能.原创 2021-02-04 22:11:51 · 17843 阅读 · 0 评论 -
算法题一:绳子最大乘积问题
剪绳子问题:题目:给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...k[m]。请问k[0]*k[1]*...k[m]可能的最大乘机是多少?例如:当绳子的长度是8时,我们把他剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。int maxProductAfterCutting(int length){ if(length<2)return 0 ; if(lengt.原创 2021-02-03 22:46:20 · 134178 阅读 · 0 评论 -
矩阵与转置
1.转置矩阵1.1转置矩阵简介把矩阵A的行换成同序数的列得到的新矩阵,叫做A的转置矩阵(Transpose of a Matrix),记作ATAT。例如:因此,转置矩阵的特点:(1)转置矩阵的行数是原矩阵的列数,转置矩阵的列数是原矩阵的行数;(2)转置矩阵下标(i,j)的元素对应于原矩阵下标(j,i)的元素。1.2实现使用二维数组作为矩阵的存储结构,根据转置矩阵的特点,很容易得到转置矩阵。/********************************...原创 2021-02-02 19:52:28 · 170287 阅读 · 0 评论 -
50行代码实现kalman算法
#creater:ljjimport cv2import numpy as np# 创建一个空帧,定义(700, 700, 3)画图区域frame = np.zeros((700, 700, 3), np.uint8) # 初始化测量坐标和鼠标运动预测的数组last_measurement = current_measurement = np.array((2, 1), np.float32)last_prediction = current_prediction = np.zer...原创 2021-01-11 19:33:18 · 149394 阅读 · 0 评论