冒泡排序
冒泡排序空间:O(1) 时间:最好O(n),最坏O(n^2),平均O(n^2) 稳定性:稳定
12345678910111213141516void BubbleSort(int a[], int n) { for (int i = 0; i < n - 1; i++) { int j = 1; bool falg = false; //本轮是否发生交换 while (j < n-i) { if (a[j] < a[j - 1]) { swap(a[j], a[j - 1]); falg = true; } if(!falg) return; j++; } }}
堆排序
堆排序12345678910111213141516171819202122232425262728293031class HeapSort {public: void sink(int a[],int n,int k) { while (k <= n / 2) { int j = 2 * k; //左孩子位置 if (j + 1 <= n && a[j] < a[j + 1]) //如果有右孩子 比较哪个大 j++; if (a[k] < a[j]) //和更大的孩子比较 swap(a[k], a[j]); //如果子节点更大就交换 else break; //否则退出 k = j; //如果交换了就更改指针 } } void swim(int a[],int n,int k) { w ...
快速排序
快速排序12345678910111213141516171819202122232425int Partition(int a[], int low, int high) { int i = low; //为了保证后面操作统一 所以各自留一位 int j = high + 1; while (true) { while (a[++i] < a[low]) if (i == high) break; while (a[--j] > a[low]) if (j == low) break; if (i >= j) break; Swap(a[i], a[j]); } Swap(a[j], a[low]); return j;}void QuickSort(int a[], int low, int high) { if (low >= high) return; int mid = Partition(a, low, high); QuickSort(a, low, mid - 1); QuickS ...
归并排序
归并排序12345678910111213141516171819202122232425void Merge(int a[],int b[],int low,int high,int mid){ int n = high-low+1; for(int k=0;k<=high;k++) b[k] = a[k]; int i = low; int j = mid+1; for(int k = 0;k<n;k++){ if(i>mid) a[k] = b[j++]; else if(j>high) a[k] = b[i++]; else if(b[i]>b[j]) a[k] = b[j++]; else a[k] = b[i++]; } }void Sort(int a[],int b[],int low,int high){ if(low>high) return; int n = high-low+1; int mid = (low+h ...
插入排序
插入排序直接插入排序每次选一个元素放到左边合适的位置 最好O(n) 最坏O(n^2) 平均(n^2/4)
12345678910111213141516void InsertionSort(int a[],int n){ for(int i = 0;i<n;i++){ for(int j = i;j>0;j--){ if(a[j]<a[j-1]) swap(a[j],a[j-1]); else //注意如果已经找到插入位置就退出循环 break; } }}void Swap(int &a,int &b){ int swap = a; a = b; b = swap;}
希尔排序 h-排序 增量序列3x+1
123456789101112131415161718void ShellSort(int a[], int n) { int h ...
选择排序
选择排序简单选择排序O(n^2)的时间复杂度 一共n-1轮 第i轮比较n-i次
123456789101112void SelectionSort(int[] &a,int length){ for(int i = 0;i<length;i++){ int min_index = i; for(int j = i;j<length;j++){ if(a[j]<=a[min_index]) min_index = j; } //注意要交换 int swap = a[i]; a[i] = a[min_index]; a[min_index] = swap; }}
队列
队列链表实现12345678910111213141516171819202122232425262728293031323334struct Node { int item; Node* next;};class Queue {private: Node* first = NULL; Node* last = NULL;public: bool isEmpty() { return first == NULL; //注意队列判空条件 } void enQueue(int x) { Node* oldlast = last; last = new Node(); last->item = x; last->next = NULL; // if (isEmpty()) first = last; else oldlast->next = last; } int deQueue() { int item = first->item; first = first- ...
栈
栈链表保证每次稳定快 数组保证总时长快
用链表实现1234567891011121314151617181920212223242526struct Node { string item; Node* next;};class Stack {private: Node* first = NULL;public: bool isEmpty() { return first == NULL; } void push(string item) { Node* oldfirst = first; first = new Node(); first->next = oldfirst; first->item = item; } string pop() { string item = first->item; first = first->next; return item; }};
用数组实现固定大小1234567891011121314151617cl ...
并查集
并查集并查集解决的问题连通问题 寻找路径
并查集的数据结构两个数组:size[n],parent[n]分别存储连通分量大小以及节点的父节点
并查集的操作Find操作 寻找连通分量的根12345int Find(int node){ int root = node; while(parent[root]!=root) //只要父节点不是本身 就一直向上找 return root;}
Union操作 将连通分量合并123456789101112131415void Union(int p,int q){ int root1 = Find(p); int root2 = Find(q); if(root1 == root2) return; //已经在一个连通分量 不操作 if(size[root1] >= size[root2]){ //把小的分量接到大的分量上 parent[root2] = root1; size[root1] += size[root2]; } else{ parent[root1] = ...
YOLO算法解析
YOLO算法解析YOLOv1预测阶段输入:448×448×3,通过卷积操作,得到7×7×1024的feature map,拉平放到4096神经元全连接层,在放到1470的全连接层,排成7×7×30的张量。(对于Pascal VOC,20个类,7×7个grid,7×7×(2×5+20))。置信度乘以最高类别概率是全概率。
预测后处理 一个框20个全概率,一共两个框,一共49个格,总共98个20×1的全概率。依次对每个类先用阈值门限,再NMS(从最高的概率开始,依次让更低的概率和最高概率比较,如果IOU超过某个值,也就是认为是同一个物体,把低的过滤掉)
训练阶段拟合的思路:让含有物体中心点的网格生成的那个IOU更大的预测框去逼近目标,不含有物体中心的网格生成的框置信度变成0。
问题定位差 全检测差 小目标密集目标差
YOLOv2改进Batch NormalizationHigh Resolution ClassifierAnchor Dimension Clusters Direct location predictionYOLOv3