算法与数据结构
文章平均质量分 92
玩命刷题
星空皓月
工欲善其事,必先利其器。
展开
-
离散化的两种实现方式【sort或者map】
把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。适用范围:数组中元素值域很大,但个数不是很多。比如将a[]=[1,3,100,2000,500000]映射到[0,1,2,3,4]这个过程就叫离散化。原创 2023-08-06 19:22:57 · 972 阅读 · 0 评论 -
计算几何基础【用图来助你理解几何算法】
计算几何基础1.基本概念1.1计算几何的引入 计算几何是几何学的一个重要分支,也是计算机科学的一个分支,研究解决几何问题的算法。在现代工程与数学、计算机图形学、机器人学、VLSI设计、计算机辅助设计等学科领域中,计算几何都有重要应用。计算几何问题的输入一般是关于一组几何物体(如点、线)的描述;输出常常是有关这些物体相关问题的回答,如直线是否相交、点围成的面积等问题。1.2 浮点数造成的误差 在学习计算几何之前,我们来回顾一下高中知识,我们求直线方程,或者是交点时,经常出现根号多少多少,以至我原创 2022-03-28 17:03:42 · 7764 阅读 · 2 评论 -
快速幂与矩阵快速幂【入门+基础】
快速幂如果我们要计算???????? mod p,我们首先能想到的便是for循环:int ans=1;for(int i=1;i<=b;i++) ans*=a;return ans%p;下面我们来看看两个例子,想一想会出现什么奇葩结果呢?奇葩结果1: 2100 mod 1000 = 0奇葩结果2: 52????12 mod 1000 ……那第一个奇葩结果就是 2^100 已经溢出了。第二个结果我们能一眼看出来,就是循环次数太多了。所以说解决这个问题O(n)是不行的。1原创 2020-07-08 11:11:35 · 819 阅读 · 3 评论 -
二叉树的静态实现(前,中,后,层序遍历和查找修改值)
/**二叉树的静态实现。**/#include<cstdio>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int MAXN=1e4;//结点的最大个数 struct Node{ int data;//数据域 int l,r;//指针域 }node[MAXN];int index=0,data[MAXN];int new原创 2020-05-14 18:31:08 · 187 阅读 · 0 评论 -
高精度整数的(+,-,*)
高精度整数加法问题求两个整数,a和b的和,(0=<a,b<=1e500)高精度整数是个什么?高精度整数就是超过整数类型(long long目前我学习到的最大整数类型)的正数,例如1e23+1e25等于多少?显然用long long也不够装,所以我们就要用字符串来处理。先来看看一个简单的例子999+111=? 999 +111 =10000思路这就需要回...原创 2020-04-05 17:45:53 · 926 阅读 · 0 评论 -
排序(三):计数排序,基数排序
下面谈到的两类排序是基于非交换排序的算法,时间复杂度都是线性的,前提必须是正整数。最下方有动画演示,便于我们理解这两个算法。计数排序计数排序,顾名思义就是对数组中的元素进行计数的方式进行排序。利用一个辅助数组count对原数组的每一位数值存储到辅助数组的下标位置。来看一个列子5, 5, 3, 100, 4 9, 100 , 3, 2, 3存储到辅助数组的情况为:coun...原创 2020-03-11 20:08:06 · 576 阅读 · 0 评论 -
排序(二):归并排序,快速排序,堆排序
归并排序归并排序是基于“归并”思想的排序方法,利用two pointers思想。这里说的是二路归并,就是将两个小集合归并为一个大集合,依次类推,当然要将集合合并,但给我们的只有一个集合,所以要先划分成n/2个个数为2的集合,动图演示。代码(递归实现)#include<stdio.h>const int MAXN=1e5;void merge(int A[],int L1,i...原创 2020-03-08 11:54:50 · 395 阅读 · 0 评论 -
基本排序算法:冒泡,选择,插入
冒泡排序总体思路:冒泡就是一个上浮的过程。每次排好最后的元素,这个算法可以作一点小的优化,标记每一趟是否交换过,如果没有则说明已排好序。只需进行len-1趟操作,因为最后一趟是已排好序的。例如 :5,3,6,1,4,2第一趟:3,5,1,4,2,6;第二趟:3,1,4,2,5,6;第三趟:1,3,2,4,5,6;第四趟:1,2,3,4,5,6;第五趟:由于标记没变,说明已排好序,退出...原创 2020-03-07 11:47:17 · 115 阅读 · 0 评论 -
三指针用法
题目:现有红,白,蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想像成条状物,有序排列后正好组成荷兰国旗。输入:第一行输入一个n,随后跟着n个正整数(0,1,2,分别代表红白蓝).50 1 2 0 1输出:将其排列成荷兰国旗形状。0 0 1 1 2思路:都知道这个题就是一个排序...原创 2020-02-28 22:10:53 · 1033 阅读 · 0 评论 -
双指针应用
题目:给定一个n个数的数组和一个sum值,找出数组中的任意两个数的和为sum。思路:题意很简单,来看一下简单的暴力来解决这个题。代码(n²):#include<cstdio>using namespace std;int arr[10002];int main(){ int n,sum; scanf("%d%d",&n,&sum); for(in...原创 2020-02-26 20:57:29 · 199 阅读 · 0 评论 -
Stirling公式的应用
Stirling数也叫做斯特林公式,是用来取N! 的近似值。在编程中,我们也用到了Stirling数的思想来解决一下问题。S(n,k)=0 (k>n or k=0)我们可以想到,将10个苹果放入100个盘是不现实的(k>n),没有盘子也是不现实的(k=0)S(n,1)=S(n,n)=1将所有苹果放入一个盘子只有一种情况(k=1),将2个苹果放入2个盘子只有一种情况...原创 2020-02-21 15:03:43 · 1570 阅读 · 0 评论 -
LCS最长公共子串:线性dp
LCS最长公共子串题目:有两个字符串,串T为ABCBDAB,而串S为BDCABA,求最长公共子串的长度:首先我们分析,如果有两个字符Ti和Sj,就有以下公式:dp[i][j]=dp[i-1][j-1]+1; T[i]==S[j];dp[i][j]=max(dp[i-1][j],dp[i][j-1]); T[i]!=S[j];可以带本题例子证出,这里就不说明了。代码:#in...原创 2020-02-16 20:52:00 · 231 阅读 · 0 评论 -
最大连续子序列和
题目:给你一个数组:1,12,-15,13,-2,6,求最大连续子序列和,这个题的答案是17,也就是13,-2,6方法一(暴力法):#include<iostream>//暴力法 #include<cstdio>#include<algorithm> using namespace std;const int MAXN=1e5;int arr[M...原创 2020-02-15 16:17:46 · 127 阅读 · 0 评论 -
STL大法(C++)
队列1.普通队列(1).定义:队列是一个先进先出的简单数据结构。queue < typename > name;(2).queue常用函数:q.push(x) 向容器中压入元素x,时间复杂度为O(1);q.front(),q.back()分别是队首元素和队尾元素,时间复杂度也为O(1);q.pop()队首元素出队,时间复杂度为O(1);q.empty()判断队列是否为空,...原创 2020-02-10 17:11:21 · 419 阅读 · 0 评论 -
线性表的存储结构
线性表线性表的概念线性表的顺序存储结构思路与代码线性表的链式存储结构线性表的概念线性表是零个或多个数据元素的有限序列,并且线性表中的元素类型必须相同,线性表在物理存储上可以分为顺序存储结构和链式存储结构。顺序存储结构:在内存空间中开辟一片连续的空间,然后把数据有序进行存储的一种方式。线性表的顺序存储结构类似于c语言中的数组,但两者的差别在于数组的长度是基本不变的,数组在申请内存空间的时候就已...原创 2020-01-16 17:06:17 · 1704 阅读 · 0 评论