![](https://img-blog.csdnimg.cn/bdb741d2806a45a3a731c84f3b490792.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构+算法(Algorithm)
文章平均质量分 68
数据存储的各种方式+程序高效核心在于算法
寅恪光潜
薛定谔的参数
展开
-
弗洛伊德龟兔赛跑算法(弗洛伊德判圈算法)
对算法时间复杂度和空间复杂度的追求,从而找到优化的算法原创 2023-03-21 09:49:02 · 967 阅读 · 10 评论 -
Go语言的冒泡排序算法以及分治法求出逆序数
逆序数的求解,分治法降低时间复杂度原创 2022-12-17 14:08:24 · 853 阅读 · 2 评论 -
农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)
DFS与BFS的应用,数据结构与算法原创 2022-12-14 14:44:36 · 1675 阅读 · 0 评论 -
弗洛伊德算法(Floyd)的实现与可视化其最短路径
弗洛伊德算法找出最短路径并画出这条路径图原创 2022-12-13 12:41:12 · 1085 阅读 · 2 评论 -
图数据结构之邻接链表Adjacency List(Python版)
熟悉数据结构中邻接链表的表达原创 2022-12-01 12:30:44 · 1016 阅读 · 2 评论 -
图数据结构之邻接矩阵Adjacency Matrix(Python版)
使用二维数组来表示顶点和它相邻节点的一种关系的图原创 2022-12-01 11:10:36 · 2711 阅读 · 0 评论 -
图数据结构之字典实现(Python版)
熟悉图这样一种数据结构(字典的表示)原创 2022-12-01 09:05:11 · 638 阅读 · 0 评论 -
2022年阿里全球数学竞赛中的集福活动(附代码解答)
概率和数学期望原创 2022-06-01 11:27:19 · 1654 阅读 · 0 评论 -
二叉树的遍历和重建
前序遍历(Preorder Tree Walk):按照根节点、左子树、右子树的顺序输出结点编号中序遍历(Inorder Tree Walk):按照左子树、根节点、右子树的顺序输出结点编号后序遍历(Postorder Tree Walk):按照左子树、右子树、根节点的顺序输出结点编号按照id left right,id为结点编号,left为左子结点编号,right为右子结点编号,不存在子结点为-1,分别输出三种遍历结果二叉树遍历会对树的每个结点进行一次访问,因此算法复杂度为O(n),但使用递归实.原创 2021-02-24 01:10:34 · 195 阅读 · 1 评论 -
树结构的储存与特点(相关基础知识)
树是一种对现实中一些问题的抽象结构,是实现高效算法的基础,一般是使用结构体数组或者三个数组来存储。树的一些属性:根、结点、子结点、兄弟结点、深度、度、树高等如何存储树,一般使用的是“左子右兄弟表示法”(left-child right-sibling representation)LCRS,来表示树,左子右兄弟表示法中各个结点具有以下信息:结点u的父结点结点u最左侧的子结点结点u右侧紧邻的兄弟结点原创 2021-01-25 01:11:52 · 2749 阅读 · 0 评论 -
最小成本排序:两种情况
最小成本排序:两个数交换,这两个数相加,一组数全部交换成有序之后,累加和就是成本。如何求出最小的成本,有一点难度,主要在于有两种情况的分析,一种是每个元素交换到正确位置(会形成一些闭合的圆),进行计算;另外一种是需要在圆外借元素(最小的那个元素),这样的成本才是最小的。所以求最小的成本就是两种情况最小的即可!公式:#include<stdio.h>#include<iostream>#include<algorithm>using namespace原创 2020-12-24 23:50:44 · 1065 阅读 · 0 评论 -
高级排序求逆序数之分治法
前面几篇文章都有讲分治法,分而治之,一种很典型的算法思想,现在求逆序数,如果是你初次接触,一般都会想到冒泡法来统计逆序数。不过冒泡法的时间复杂度确实高(n²),所以接下来运用分治法来实现,求数组{5,3,6,2,1,4}的逆序数?#include<stdio.h>#include<iostream>using namespace std;#define MAX 1000#define SENTINEL 100000;typedef long long llong;原创 2020-12-13 01:14:23 · 239 阅读 · 0 评论 -
高级排序之计数排序
计数排序是一种非比较的排序,也就是说不需要进行元素之间的比较,就可以把数列给排序好!前提条件就是该数组里的元素是非负(因为需要用到索引,而索引没有负数)我们从A数组的末尾开始,逐个地引用元素复制到结果数组(B)里面的适当位置,比如复制5,此时C[5]=8,意思是数组A中包含8个小于等于5的元素,那么5就要复制到结果数组B[8]的位置!复制之后,A数组就少一个元素,以此类推!只要我们从输入数组A的末尾元素开始选择,那么计数排序就属于稳定的排序算法,时间复杂度:O(n+k),是一种高效的算法。原创 2020-12-03 23:42:23 · 160 阅读 · 0 评论 -
高级排序之快速排序(分割与整合)
在上一篇文章:高级排序之分割法中介绍分割法的基础上,做一个递归就是现在介绍的快速排序!快速排序的原理就是将数组以某个基准值进行分割,左边是小于这个基准值的数列,右边是大于这个基准值的数列,再通过递归,就可以把原数组进行排序了#include<stdio.h>#define MAX 10000int A[MAX],n;int mypartition(int left,int right){ int x,i,j,t; x=A[right];//最后一个元素作为分割的原创 2020-11-29 23:54:10 · 276 阅读 · 0 评论 -
高级排序之分割法(以某数为基准分割)
示例为最后一个元素为分割的基准值,小于这个值的在左边,大于这个基准值的在右边最后一个数是5,以5为判断基准!#include<stdio.h>#define MAX 10000int A[MAX],n;int mypartition(int left,int right){ int x,i,j,t; x=A[right];//最后一个元素作为分割的基准 i=left-1; for(j=left; j<right; j++) .原创 2020-11-28 00:53:41 · 160 阅读 · 0 评论 -
归并算法(分割与合并)
归并算法也是一种分治法,分治法与递归求科赫曲线,是递归变化的一种高级排序!#include <iostream>#include<stdio.h>#include<string>#define MAX 100#define SENTINEL 999999using namespace std;int L[MAX/2+2],R[MAX/2+2];int cnt;//归并算法,将两个已经排序的序列合并成一个序列的操作//分治法(Divide and原创 2020-11-09 00:48:39 · 760 阅读 · 0 评论 -
分治法与递归求科赫曲线
分治法:把问题进行分解,通过求解局部的小问题来解开原本的问题。实现分治法需要用到递归#include <iostream>#include<stdio.h>#include<math.h>//定义结构体,坐标struct Point{ double x,y;};//a,b代表线段起始与结束的两点void koch(int n,Point a,Point b){ if(n==0) { return ;..原创 2020-11-04 01:04:05 · 295 阅读 · 0 评论 -
C++二分查找示例(求货物装载量)
C++二分查找,我们了解了二分查找的算法以及它的算法复杂度,效率还是不错的。通过一个示例来说明下,传送带一次送来n个货物重量为w,使用k辆卡车来装载,求出装载全部货物所需的最大运载量P的最小值。#include <iostream>using namespace std;#define MAX 100typedef long long ll;int n,k;//n个货物,k辆卡车ll T[MAX];//题目:传送带一次送来n个货物重量为w,使用k辆卡车来装载,求出装载全部原创 2020-08-12 22:58:52 · 406 阅读 · 0 评论 -
C++散列法
散列法是一种搜索算法,它可以根据各元素的值来确定存储位置,然后将位置保管在散列表中,从而实现高速搜索其中散列表是一种数据结构,能对包含关键字的数据集合高效地执行动态插入、搜索、删除操作。散列法如果忽略发生冲突(不同的key对应同一散列值)的情况,那么插入和搜索元素的算法复杂度是O(1)开放地址法是解决这类冲突的常用手段之一只要散列函数h起了冲突,就依次调用h(key,0),h(key,1),h(key,2)...,直到不发生冲突为止,然后返回的值作为散列值#include <ios原创 2020-08-03 00:07:10 · 646 阅读 · 0 评论 -
C++二分查找,时间复杂度是O(logn)
二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改://C++排序是升序还是降序//a>b是降序,a<b是升序bool compare(int a,int b){ return a>b;}//降序,其中Arr是数组首地址(数组名即可),第二个参数就是首地址加数组长度sort(Arr,Arr+n,compare);如果没有第三个参数,默认就是升序sort(Arr原创 2020-07-31 13:10:35 · 898 阅读 · 0 评论 -
数据结构:列表(双向链表)的了解与示例
双向链表:结点是结构体,三部分组成,数据本身、指向前一元素的指针、指向后一元素的指针,这些结构体通过指针连接成一个链形如: prev key nextstruct Node{ int key; Node *prev,*next};引入一个“头结点”的概念,虽然不包含实际数据,但它可以让我们更轻松地对链表做更改,是添加元素的起点如下生成一个NIL结点作为链表的头结点,然后让prev和next都指向这个头结点,从而创建一个空表Node *nilvoid init(){ ...原创 2020-05-08 20:37:03 · 294 阅读 · 0 评论 -
数据结构:栈的了解与示例(逆波兰表达式)
数据结构一般需要具备三点1、能保存数据集合2、需按照一定规则进行操作3、可以对数据做各种操作#include <iostream>using namespace std;//熟悉栈这种数据结构,使用数组来模拟实现存储整型数据的栈//示例:逆波兰表达式int top,S[1000];//入栈:top所在位置加1的位置插入元素xvoid push(int...原创 2020-05-06 21:36:48 · 151 阅读 · 0 评论 -
数据结构:队列的了解与示例(CPU处理任务的时间)
使用数组来模拟队列CPU模拟调度所有任务,总共n个任务,每个任务处理时间不同,最多处理t(时间片),如果t时间没有处理完毕就把该任务移动到所有任务的后面如果我们使用平时常用的队列,那么随着数据的不断进出,将出现溢出的现象所以我们把数组形成一个环形的缓冲区,就是一维数组形成一个圆圈,另外我们为了区分队列的空和满,我们规定头和尾之间至少有一个空位#include <ios...原创 2020-05-07 23:56:38 · 529 阅读 · 0 评论 -
希尔排序法(插入排序的改进版本)
希尔排序是在插入排序的基础上的一点改进,对于插入排序很熟悉的,希尔排序就很容易理解,如果插入排序不是很清楚的,可以看下插入排序的用法:插入排序简单来说,希尔排序增加了一个参数,叫做增量g,我们就是使用g为间隔做插入排序(平时所说的插入排序其实可以看做g为1),逻辑上来看,是分成了很多子数组,那么ShellSort(R,len)可以看做是insertionSort(R,len,g)插入排序的循环...原创 2020-05-01 01:24:14 · 389 阅读 · 0 评论 -
插入排序法
insertionSort.cpp/*插入排序:将未排序的值(从第二个位置开始)插入到已排序(将开头元素视为已排序)的合适位置在已排序部分,将所有比v大的元素向后移动一个单位优势:能够快速处理相对有序的数据复杂度O(n²)*/#include<iostream>using namespace std;void insertionSort(int R[],...原创 2019-10-11 19:28:31 · 129 阅读 · 0 评论 -
大数据整型的加减乘除
#include <iostream>#include <string>using namespace std;//相等返回0,大于返回1,小于返回-1inline int compare(string str1,string str2){ if (str1.size()>str2.size()) return 1; //长度长的整...原创 2019-09-23 17:14:36 · 321 阅读 · 0 评论 -
求浮点数的幂的精确值
//http://poj.org/problem?id=1001//求浮点数的幂的精确值,R的n次方,R是实数(0.0<R<99.999),n是幂(0<n<=25)大数据求幂95.123 120.4321 205.1234 156.7592 998.999 101.0100 12548815620517731830194541.8990253...原创 2019-09-20 17:29:17 · 309 阅读 · 0 评论