算法

[笔记]《算法图解》第一章 算法简介

两盒软妹~` 提交于 2020-01-15 12:19:21
大O表示法 - 大O表示法指出了算法有多快,例如列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。 - 大O表示法指的并非以秒为单位的速度。大O表示法能够让你比较操作数,它指出了算法运行的增速。 - 二分查找需要执行logn次操作,使用大O表示法,运行时间O(logn)。 - 简单查找的运行时间总是O(n),但是大O表示法说的是最糟糕的情形。因此简单查找的运行时间不超过O(n)。 常见的大O运行时间 - O(logn)对数时间,常见算法:二分查找。 - O(n)线性时间,常见算法:简单查找。 - O(n*logn),快速排序。 - O(n^2),选择排序。 - O(n!),旅行商算法。 算法绘制网格所需要的时间: 二分算法(python实现) #!/usr/bin/env python3 # -*- coding: utf-8 -*- \""" @desc: binary search @author: Bingo Cai \""" def binary_search(list, item): low = 0 high = len(list) - 1 while low <= high: mid = int((low + high)/2) guess = list[mid] if guess == item: return mid if guess > item:

记一次RK算法

China☆狼群 提交于 2020-01-15 11:38:16
public class RK { public static int rabinKarp(String str, String pattern){ int m = str.length(); int n = pattern.length(); int patternCode = hash(pattern); int strCode = hash(str.substring(0,n)); for(int i = 0;i<m-n+1;i++){ if(strCode == patternCode && compareString(i, str, pattern)){ return i; } if(i < m-n){ strCode = nextHash(str, strCode, i, n); } } return -1; } public static int hash(String str){ int hashcode = 0; for(int i = 0 ; i<str.length() ; i++){ hashcode += str.charAt(i)-'a'; } return hashcode ; } public static int nextHash(String str, int hash, int index, int n){ hash -= str.charAt

React的Diff算法

喜夏-厌秋 提交于 2020-01-15 07:59:45
使用React或者RN开发APP如果不知道Diff算法的话简直是说不过去啊。毕竟“知其然,知其所以然”这句老话从远古喊到现代了。 以下内容基本是 官网文章 的一个总结、压缩。这次要谦虚一下,毕竟深入研究RN的时间不多,如果有什么理解的不对的地方还请各位读者指正。 React的组件在渲染之后组成了一个树形结构。在React绘制的时候,会在内存里对应每一个组件建立一个节点,并最终形成一个和组件树结构一样的树。我们就叫这个树叫影子树(这个叫法不是出自官方)。我们可以理解为这个 影子树包含了React App组建的结构和一些属性值 。 在组件发生变化的时候(一般是调用了 setState ),React会形成一个影子树二号。然后对比影子树1号和影子树2号的不同。 我们知道对比两个树的最小不同的时间复杂度是O(n3 ),n是树里的节点数。这个复杂度下,稍有量级的应用都会遇到一个问题:无法忽略的慢。于是,FB的同学们使用了更加高效的启发式算法,把复杂度降低到了O(n)。 但是,不管是什么算法最后都需要对比两个节点的不同。有三种情况需要考虑: 一、节点之间的比较 节点,英语里的Node,包括两种类型:一个是React组件,一个是HTML的DOM。下文也是同样的含义。 节点类型不同 如果是HTML DOM不同的话,直接使用新的替换旧的。 如果是组件类型不同的话也直接使用新的替换旧的。 HTML

机器学习(4)线性回归算法总结

房东的猫 提交于 2020-01-15 07:42:23
回归算法和logistics算法总结 1、回归算法简介: 回归算法还是属于分类算法。Numpy、Panads、Matplotlib、Scilit-learn。线性回归一般用来做连续值的预测,预测的结果为一个连续值。因训练时学习样本不仅要提供学习的特征向量X,而且还要提供样本的实际结果(标记label,所以它是一种有监督学习。其中 X={x0,x1,...,xn}。 2、算法原理推导: 3、目标函数求解 4、逻辑回归原理 5、梯度下降原理 6、梯度下降实例 来源: CSDN 作者: 庄小焱 链接: https://blog.csdn.net/weixin_41605937/article/details/103752675

Graham算法

守給你的承諾、 提交于 2020-01-15 07:24:19
前言:本菜鸡的第一篇算几,记录一下我有多菜 Graham算法 一种凸包算法,扫描部分的时间复杂度为 O ( n ) \mathcal{O}(n) O ( n ) ,总的时间复杂度 O ( n l o g n ) \mathcal{O}(nlogn) O ( n l o g n ) 原理:从点集中先找出一个最左下方的点,易证这个点肯定在凸包上,然后以这点为极点,将所有点根据与这点的极角进行排序,并且同时使用一个栈结构维护凸包上的点。按照极角序依次将当前点与栈顶的两个点作拐向判断:若右拐,则将当前点加入栈中,否则将栈顶点弹出。当点集遍历完之后,还在栈中的点就是凸包上的点。 算法步骤 对所有点进行排序,选择 x x x 坐标最小的点作为极点,即找到第一个一定在凸包上的点 bool cmp1 ( const Pnt & a , const Pnt & b ) { return a . x != b . x ? a . x < b . x : a . y < b . y ; } 将其余所有点按照极角排序,在极角相同的情况下比较与极点的距离,按极角序依次处理每一个点 inline bool cmp2 ( const Pnt & st , const Pnt & ed ) { //按极角排序 int del = p [ st ] * p [ ed ] ; if ( del != 0 )

前中后缀表达式相关算法

孤者浪人 提交于 2020-01-15 06:05:10
目录 前言 1.判断优先级函数 2.运算函数 3.取运算数、操作数进行运算 一、表达式转换 1.中缀表达式转后缀表达式 2、中缀表达式转前缀表达式 二、表达式求值 1.中缀表达式求值 2.前缀表达式求值 3.后缀表达式求值 前言 1.判断优先级函数 int getPiority(char op){ if(op=='+'||op=='-') return 0; else return 1; } 2.运算函数 //运算函数 int calSub(float opand1,char op,float opand2,float &result){ if(op=='+') result=opand1+opand2; if(op=='-') result=opand1-opand2; if(op=='*') result=opand1*opand2; if(op=='/'){ if(fabs(opand2)<MIN){ return 0; } else { result=opand1/opand2; } } return 1; } 3.取运算数、操作数进行运算 //取运算数、操作数进行运算代码的封装 int calStackTopTwo(float s1[],int &top1,char s2[],int &top2){ float opand1,opand2,result; char op;

C++移除型算法之移除重复元素

我只是一个虾纸丫 提交于 2020-01-15 04:54:25
移除连续重复元素 # include "algostuff.hpp" //.h和.cpp写在一起的文件 using namespace std ; int main ( ) { int source [ ] = { 1 , 4 , 4 , 6 , 1 , 2 , 2 , 3 , 1 , 6 , 6 , 6 , 5 , 7 , 5 , 4 , 4 } ; list < int > coll ; copy ( begin ( source ) , end ( source ) , back_inserter ( coll ) ) ; PRINT_ELEMENTS ( coll ) ; auto pos = unique ( coll . begin ( ) , coll . end ( ) ) ; copy ( coll . begin ( ) , pos , ostream_iterator < int > ( cout , " " ) ) ; cout << "\n\n" ; copy ( begin ( source ) , end ( source ) , coll . begin ( ) ) ; PRINT_ELEMENTS ( coll ) ; coll . erase ( unique ( coll . begin ( ) , coll . end ( ) ,

值得跟进的最新目标检测算法

十年热恋 提交于 2020-01-15 04:27:25
聊一聊最新的目标检测算法 公众号: 卡本特 后台回复 “09” 获取打包文章 上一篇文章写了现在目标检测还有哪些东西可以做,然后有读者就问了目前有哪些值得工程部署去应用的算法,所以今天来聊一聊值得去跟进的一些目标检测算法。 上面这张图是2015年到2019年的SOAT的算法在coco上的box AP指标变化折线图,从这张图里面可以看出目前最好的成绩是53.3,其方法还是Cascade Mask RCNN,主干网络是Triple-ResNeXt152。目标检测最近值得关注的文章莫过于EfficientDet,虽然其EfficientDet-D7的成绩为51.0稍逊于SOAT的53.3,但是其方法很值得关注一波。 我根据最近的coco上的成绩,列了一个表格,如下 排名 方法 Box AP 文章链接 github 1 Cascade Mask R-CNN 53.3 CBNet CBNet 2 EfficientDet-D7 51.0 EfficientDet pytorch版 TF版 3 ATSS 50.7 ATSS ATSS 4 EfficientDet-D6 50.6 5 EfficientDet-D5 49.8 6 TridentNet 48.4 TridentNet simpleDet 7 GCNet 48.4 GCNet GCNet 21 FCOS 44.7 FCOS FCOS

王道考研数据结构笔记之算法分析

这一生的挚爱 提交于 2020-01-15 04:00:37
算法的基本概念 算法 是对特定问题求解步骤的一种描述,它是指令的有限序列。具有下列五个重要特性: 有穷性:一个算法必须在有限的步骤结束,每一步都有在又穷的时间内结束 确定性:相同的输入只能得到相同的输出 可行性:可以被执行的操作 输入:有零个或多个输入 输出:有一个或多个输出 一个好的算法应该达到一下目标: 正确性:能够正确解决问题 可读性:具有良好的可读性,帮助别人理解 健壮性:输入非法数据,能够正确处理 效率与低存储量需求:尽量少的时间和空间 算法效率的度量 1、时间复杂度 一个语句的 频度 是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为 T(n) 。时间复杂度主要分析T(n)的数量级。算法中基本运算(最深层循环内的语句)的频度记为 f(n) ,因此时间复杂度记为: T(n)=O(f(n)) 分析一个程序的时间复杂性时,有以下两条规则: a) 加法规则 T(n)=T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n))) b)乘法规则 T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n)) 常见的时间复杂度 O(1)<O(log(n))<O(n)<O(nlog(n))<O(n * n)<O(n * n * n) 2、空间复杂度 空间复杂度**S(n)*

算法——归并排序

我们两清 提交于 2020-01-15 02:02:01
归并排序 ​ 归并排序是另一种排序算法,也是采用分治的思想,但是和快排有很大的区别,归并排序是稳定的,而快排则不稳定 归并的思想 ​ 归并排序的思想可以简单的分为三个步骤: 确定分界点 mid 递归分界点得到左右空间 归并,将若干数组合并为一个有序数组 确定分界点 ​ 确定分界点,归并排序的分界点即为数组的中点,设数组左边界为 left,有边界为 right,那么分界点 mid 便为 int mid = (l + r) / 2; ​ 归并排序的分界点和快排的分界点有本质的区别,快排的分界点是对数组的元素值而言的,而归并排序的分界点是就数组的 index 来说的 ​ 通过确定的分界点,一个数组就被分解成了两个以 mid 为分界的数组,第一个数组的就原素组而言的下标范围是 left <= index <= mid,第二个数组是 mid + 1 <= index <= right 递归分界点左右空间 ​ 根据第一步得到的结果,可以使用递归将得到的两个数组继续分解,即 merge_sort(q, l, mid); merge_sort(q, mid + 1, r); 归并 ​ 这是归并排序最重要的一步,是对归并得到的数组得处理,对于两个有序数组来说,想要合并,就要不断得对比数组头位置元素的大小,这又是使用双指针,分别指向两个数组的头元素,不断对比两个指针对应元素大小,保存较小的那个