博客作业06--图

1.学习总结

1.1图的思维导图

1.2 图结构学习体会

  • 深度优先遍历:从顶点v出发,以纵向方式一步一步向后访问各个顶点。查找所有顶点的所有邻接点所需时间为O(n2),n为顶点数,算法时间复杂度为O(n²)
  • 广度优先遍历:从顶点v出发,以横向方式一步一步向后访问各个顶点。查找每个顶点的邻接点所需时间为O(n2),n为顶点数,算法的时间复杂度为O(n²)
  • Prim算法: 时间复杂度为O(n²)
  • Kruscal算法:时间复杂度:O(e²)
  • Dijkstra算法:时间复杂度:O(n²) 堆优化后O(nlogn)
  • 拓扑排序算法:时间复杂度:O(n²)

2.PTA实验作业

2.1 题目1:7-1 图着色问题

2.2 设计思路

    vector<int>Q[501];
    for i=0 to e
        输入ab,Q[a].push_back(b),Q[b].push_back(a);
    while sum--
        s.clear();
        for i=1 to v
		输入color[i];
		s.insert(color[i]);
        for i=1 to v
	    for j=0 to Q[i].size()
			如果color[i]==color[Q[i][j]]
				flag置0,结束循环
		如果flag==0 结束循环
	如果flag==1 输出Yes,否则输出No

2.3 代码截图

2.4 PTA提交列表说明

  • 无问题

2.1 题目1:7-2 排座位

2.2 设计思路

    for i=0 to M
	输入abs
	friends[a][b]=s;
	friends[b][a]=s;
    for i=0 to K
		若friends[a][b]==1,输出No problem
		flag=0;
		vis[a][b]=vis[b][a]=1;
		VIS(a,b);
		若friends[a][b]==-1
			如果flag==1 输出OK but...
                        否则输出No way
		否则
			如果flag==1 输出No problem
			否则输出OK

2.3 代码截图


2.4 PTA提交列表说明

  • 无问题

2.1 题目1:7-3 六度空间

2.2 设计思路

    for i=0 to k
	输入ab
	a--;b--;
	G[a][b]=G[b][a]=1;
	
    for i=0 to N
	for j=0 to N
		visited[j]=0;
	num=BFS(i);
	um=num*1.0/N*100;
	输出i+1,sum

2.3 代码截图


2.4 PTA提交列表说明

  • 无问题

3.截图本周题目集的PTA最后排名

3.1 PTA排名

3.2 我的总分:250

4. 阅读代码

  • 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出,它的优势在于在对于较小范围内的整数排序。它的复杂度为Ο(n+k)(其中k是待排序数的范围),快于任何比较排序算法,缺点就是非常消耗空间。很明显,如果而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序,比如堆排序和归并排序和快速排序。
  • 算法原理: 基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,在代码中作适当的修改即可。
  • 算法步骤:
    (1)找出待排序的数组中最大的元素;
    (2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
    (3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
    (4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
  • 时间复杂度:Ο(n+k)。
  • 空间复杂度:Ο(k)。
  • 要求:待排序数中最大数值不能太大。
  • 稳定性:稳定。
#define MAXNUM 20    //待排序数的最大个数
#define MAX    100   //待排序数的最大值
int sorted_arr[MAXNUM]={0};
//计算排序
//arr:待排序数组,sorted_arr:排好序的数组,n:待排序数组长度
void countSort(int *arr, int *sorted_arr, int n)  
{   
    int i;   
    int *count_arr = (int *)malloc(sizeof(int) * (MAX+1));  
    //初始化计数数组   
    memset(count_arr,0,sizeof(int) * (MAX+1));
    //统计i的次数   
    for(i = 0;i<n;i++)  
        count_arr[arr[i]]++;  
    //对所有的计数累加,作用是统计arr数组值和小于小于arr数组值出现的个数
    for(i = 1; i<=MAX; i++)  
        count_arr[i] += count_arr[i-1];   
    //逆向遍历源数组(保证稳定性),根据计数数组中对应的值填充到新的数组中   
    for(i = n-1; i>=0; i--)  
    {  
        //count_arr[arr[i]]表示arr数组中包括arr[i]和小于arr[i]的总数
        sorted_arr[count_arr[arr[i]]-1] = arr[i];  
        //如果arr数组中有相同的数,arr[i]的下标减一
        count_arr[arr[i]]--;    
    }
    free(count_arr);
}
posted @ 2018-06-17 21:23  做人要有疯度  阅读(227)  评论(0编辑  收藏  举报