《算法C语言实现》————快速-查找算法(quick-find algorithm)

  算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的。初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改为q。我们也可以选择另外一种方式,把所有名为q的元素改为p。

  这个程序从标准输入读取小于N的非负整数对序列(对p-q表示"把对象β 连接到q"),并且输出还未连通的输入对。程序中使用数组id,每个元素表示一个对象,且具有以下性质,当且仅当p和q时连通的,id[p]和id[q]想等。为简化起见,定义N为编译时的常数。另一方面,也可以从输入得到它,并动态地为它分配id数组。

/*
@file   quickfind.c
@brief  利用快速查找算法来解决小规模的连通性问题
*/
#include <stdio.h>
#define N 1000

int main(void)
{
    int i, p, q, t;
    int id[N];
    //初始化对象集合中元素的初始值
    for (i = 0; i < N; i++) id[i] = i;
    //循环读入整数对
    while (scanf_s("%d-%d", &p, &q) == 2)
    {
        //如果对象p与q是连通的,则从标准输入读取下一对整数对
        if (id[p] == id[q]) continue;
        //如果id[p]与id[q]的值不相等,则说明p-q是新对
        //则将所有原本与id[p]元素值相等的所有元素连接到q
        for (t = id[p], i = 0; i < N; i++)
        {
            if (id[i] == t)
                id[i] = id[q];
        }
        //因为p-q是新对,所以输出这个对
        printf("New pair: %d-%d\n", p, q);
    }

    return 0;
}

没明白这是干什么用的,就是遍历,赋值而已

时间: 2024-10-07 06:51:57

《算法C语言实现》————快速-查找算法(quick-find algorithm)的相关文章

Java中Map相关的快速查找算法与唯一性(转载)

原文地址:http://blog.csdn.net/chuyuqing/article/details/19629229 在对<Set和hashCode()>的一篇原创文章写完后,由于对自己的一些论断产生了模糊和怀疑,因此又对Set进行了一些研究,形成本篇. 在Set的使用场景中,我们不外乎看中了她存储数据的唯一性,即不能存储重复值,这在某些应用场合下是很必要的一个特性.那么从更深一层来考虑,Set究竟如何使数据不重复的呢?从另一个层面来考虑,她又如何确保在验证数据是否重复过程中的快速性呢?假

JAVA算法1——连通性问题之快速查找算法

假设现在有一个整数对序列,每个整数对代表某周类型的对象,我们用P-Q对表示"P链接到Q".我们假设这种关系具有传递性,即如果p链接到q,而q又连接到r,则p连接到r. 下面的程序是一个简单算法的实现,这个算法是解决连通性问题的快速查找算法.该算法的基础是一个整数数组,当且仅当第p个数组元素和第q个数组元素是相等的,则p与q是相连的.我们把第i个元素初始化为i(0 ≤i≤N).要完成p和q的合并操作,需要搜索整个数组,把所有与第p个数组元素相同的元素全部改为第q个数组元素的值. publ

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量#define LISTINCREMENT 10//线性表存储空间的分配增量//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef

【算法学习笔记】-二分查找算法

二分搜索是一种常用的搜索方法,它要求数组中的元素必须是有序存放的.不失一般性,我们假定数组元素按升序存放.二分搜索方法首先将关键字与位于数组中央的元素进行比较,比较结果有三种情况: 1)如果关键字小于中央元素,我们只需要继续在数组的前半部分进行搜索. 2)如果关键字与中央元素相等,则搜索结束,找到匹配元素. 3)如果关键字大于中央元素,我们只需要继续在数组的后半部分进行搜索. 二分搜索的代码如下: #include <iostream> using namespace std; int bin

JAVA算法2——连通性问题之快速合并算法

我们考虑的下一个算法是与快速查找算法互补的快速合并算法.它基于相同的数据结构--以对象名作为索引的数组--但由于它对元素值的解释与快速查找算法不同,因此导致了更复杂的抽象结构.在一个无循环的结构中,每个对象都与同一集合中的另一个对象有连接.要判断两个对象是否在同一个集合中,我们分别沿着每一个对象的连线走,知道到达某一个有到自身连接的对象.两个对象在同一个集合中,当且仅当他们的终点是同一个对象.如果两个对象不在同一个集合中,则分别循着他们的连线往前走,终点将不是同一个对象.那么,要实现合并操作,我

Knowledge_SPA——精研查找算法

首先保证这一篇分析查找算法的文章,气质与大部分搜索引擎搜索到的文章不同,主要体现在代码上面,会更加高级,会结合到很多之前研究过的内容,例如设计模式,泛型等.这也与我的上一篇面向程序员编程--精研排序算法不尽相同. 关键字:二分查找树,红黑树,散列表,哈希,索引,泛型,API设计,日志设计,测试设计,重构 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算. 当今世纪,IT界最重要的词就是"数据!数据!数据!",高效检索这些信息的能力是处理他们的重要前提.数

有序向量的查找算法

声明:本文是对 xuetangx 清华大学 丁俊晖 老师 数据结构 课程的个人总结. 说到有序向量的查找算法,首先蹦入脑海的肯定是二分查找算法. 然而,即便是简单的二分查找也没有想象的那么简单. 首先考虑一些特殊情形: 1.查找的元素不存在: 2.要查找的元素值存在多个. 当然,对于不存在的情况,我们可以简单的返回一个 -1 代表未查找到,但很多时候,这样做往往是不够的.比如说,我们在调用查找之后,很有可能紧接着需要考虑插入一个值使原向量依然保持有序,而如果我们仅仅只是返回一个未查找到的 -1

七大查找算法(附C语言代码实现)

来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契查找 5.树表查找 6.分块查找 7.哈希查找 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找都可以归为一类--插值查找.插值查找和斐波那契查找是