青少年编程知识记录 codecoming

排序算法中的一些分类

一、比较和非比较的排序二、时间复杂度和稳定性如何界定一个排序算法是否是稳定的?假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
作者:亿万年的星光 分类:C++知识 浏览:

最小生成树(1)

一、定义一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。二、概述在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集且为无循环图,使得联通所有结点的的 w(T) 最小,则此 T 为 G 的最小生成树。最小生成树其实是最小权重生成树的简称。三、生成
作者:亿万年的星光 分类:C++知识 浏览:

C++中的位宽与保留小数

一、setw函数C++ setw() 函数用于设置字段的宽度,语法格式如下setw(n)比如:#include <bits/stdc++.h> using namespace std; int main () { cout<<setw(6)<<23; return 0; }二、字符填充setfill上面是用空格填充的,可以指定某些字符进行填充。#include <
作者:亿万年的星光 分类:C++知识 浏览:

拓扑排序

一、定义对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。通俗地说,‌拓扑排序就是由某个集合上的一个偏序得到该集合上的一个全序的操作。‌二、拓扑排序方法(

标签: 数据结构

作者:亿万年的星光 分类:C++知识 浏览:

【题解】盈亏问题

【题目描述】

一群人团购一件物品:

如果每人出 a元,所付总金额比物价多出了x 元;

如果每人少出 1元,也就是每人出a-1元,所付总金额比物价少了y元。

给定 a,x,y求参与团购的人数及该物品的价格。

【输入描述】

单独一行:三个整数:a,x及y

【输出描述】

单独一行:两个整数。第一个整数表示参与的人数,第二个整数表示物品的价格,中间用一个空格分开。

【样例输入】

8 3 4

【样例输出】

7 53

【数据范围】

  • 1≤a≤1000

  • 1𝑥10001≤x≤1000

  • 1𝑦10001≤y≤1000



作者:亿万年的星光 分类:C++知识 浏览:

编写第一个C++程序

前面的文章介绍了Dev-C++的下载安装:【入门篇】>>> DEVC++下载、安装、简单使用 - 青少年编程知识记录 (codecoming.com)今天讲一下如何使用Dev-C++如何编写第一个程序。第一步,新建空白程序文件:第二步,输入以下代码:#include<iostream> using namespace std; int main(){ cout<<"Hello World!&quo
作者:亿万年的星光 分类:C++知识 浏览:

【数据结构】并查集2

上一篇文章,简单介绍了并查集。这篇文章,介绍一下并查集的改进以及优化。find函数的优化(路径压缩)因为并查集的merge操作:void merge(int a, int b) { //先找到两个元素对应的根对应的元素  int fa = find(a);  int fb = find(b); if(fa==fb) return; els
作者:亿万年的星光 分类:C++知识 浏览:

【数据结构】并查集1

1.引入

    对于一个集合S={a1, a2, …, an-1, an},我们还可以对集合S进一步划分: S1,S2,…,Sm-1,Sm,我们希望能够快速确定S中的两两元素是否属于S的同一子集。

    举个栗子,S={0,1, 2, 3, 4, 5, 6},如果我们按照一定的规则对集合S进行划分,假设划分后为S1={1, 2, 4}, S2={3, 6},S3={0, 5},任意给定两个元素,我们如何确定它们是否属于同一子集?某些合并子集后,又如何确定两两关系?基于此类问题便出现了并查集这种数据结构。

2.概念

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。

并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。

3.作用

    并查集可以高效的对元素进行分组(合并在一起),并且能快速的查询两个元素是否属于同一组。

4.基本操作

    合并:合并两个集合。join函数

    查找:判断两个元素是否在一个集合。find函数 

5.过程解释

    假如有两个集合,之间的关系可以用下面的图像表示:

一开始,分成两组,1和2是同一组,1和3是同一组,那么有没有什么办法可以将这两组练习起来。我们将1视为2的父级,1可以视为3的父级

这样,我们可以把图片划分成下面这样:

那么如果我们有其他的数据,比如下面的4,5,6这样表示

那么新问题来了,这两个集合如果在一块应该怎么表示呢?很简单,让这两个集合中的‘老大’打一架,谁赢了,谁就是两个集合共同的‘老大’。

假如 编号1 赢了,那么集合应该变成下面这样:

也就1成了所有人的‘老大’

那么也就是形成了一个等级严格的树形结构。

从数据结构上看,我们关注的重点是两个数据之间是否连通。

那么看下面这个例子

对于上面这个图,我们如何界定两个节点之间是否有关系呢?比如下面这两个题:

(1)问:2和3之间是否存在关系?

(2)问:3和7之间是否存在关系?

对于问题(1),我们从图中可以很明显的看出,2和3之间有关系,因为他们有共同的’老大‘。

对于问题(2),  我们从图中也可以明显的看出,3和7之间没有关系,因为从3开始往上找,发现老大是1,而从7开始找,我们发现老大是4,这两个老大(根节点)不一样,说明没有关系。

在做题中,也就是我们输入每组的对应关系如下,

1 2  1 3  4 5  4 6  6 7

然后询问任意两个数(节点)之间有没有关系?





6.代码实现

(1)初始化

我们用f数组表示父级元素节点,初始化代码如下

int f[100]; //父节点     //初始化 n个元素   void Init() {  	//使每个元素的根节点是其本身  	//即初始时每个元素都是单独的   	for(int i=1; i<=n; i++){  			f[i]=i;    	}   }

’每个节点都是自己的父节点‘



(2)查询操作

查询操作有两种实现方式,一种是递归实现,另一种是非递归实现。

递归实现:

int find(int x){      if(f[x] == x)          return x;      else          return find(f[x]);}

一层一层访问父节点,直至根节点(根节点的标志就是父节点是本身)。要判断两个元素是否属于同一个集合,只需要看它们的根节点是否相同即可。

非递归实现:

int find(int x) {  	while(f[x] != x) {  //直到元素的父节点是它本身,表示已经查询到了树的根  		x= f[x];  	return x; 			//返回根节点对应的元素   }





(3)合并

void merge(int a, int b) {  	//先找到两个元素对应的根对应的元素   	int fa = find(a);   	int fb = find(b);  	if(fa==fb) return;  	else f[fa]=fb;  //否则令元素 a的根指向元素 b的根   }

合并操作也是很简单的,先找到两个集合的代表元素,然后将前者的父节点设为后者即可。当然也可以将后者的父节点设为前者。

作者:亿万年的星光 分类:C++知识 浏览:

unsigned

在一些代码中,经常能看到unsigned这种数据类型,比如下面这样的。#include<iostream> using namespace std; int main(){ unsigned int x; int y; cin>>x>>y; cout<<x<<" "<<y; return 0; }那么
作者:亿万年的星光 分类:C++知识 浏览:

【数论】快速乘

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘。快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利用了一个bug才实现的功能。这个bug 就是 long double 和long long 的定义范围不同。因为long double的范围比long long 大一些。它来源于下面这篇文章:什么意思呢?简单来说,就是就是在原地爆炸的边缘疯狂试探,把本来存进long long会炸掉的值先进行计算,用
作者:亿万年的星光 分类:C++知识 浏览: