首页 > 其他 > 详细

02-对不重复的一组数据查找

时间:2016-01-19 14:02:18      阅读:144      评论:0      收藏:0      [点我收藏+]

假如10个学生数据(学号 成绩)不重复,查找数据的思路:

1.从头到尾顺序遍历。O(N)

2.排序后,二分查找。O(logN)

3.建立索引,直接定位。O(1)

 

如何建立索引?

此处假设学生学号数据类型int,范围【0,100】。

学生的学号作为数据存放数组的索引下标。

实际情况中,学号往往以字符串方式存在,数据也多位于文件中,则可以将字符串和文件中地址位置进行关联。查找时,通过字符串查找到文件地址,进而直接获取数据即可。因为学号具有唯一性,所以将学号和地址作为一对hash值进行存储即可。或者按照学号进行排序存储,搜索按照二分查找学号,进而找到对应的地址(文件中的位置或者内存中的位置),进而快速获取对应的数据。此方法适用于大数据量的预处理。

 

#include <iostream>

#include <memory>

#include <string>

#include "StringTools.h"

using namespace std;

 

struct StStudent

{

    string no;

    int score;

};

 

void printStudent(const StStudent& student)

{

    cout<<"student "<<student.no<<" "

        <<"score: "<<student.score<<endl;

}

 

// 10 23 34 83 28 25 82 73 92 13

int main()

{

    const int INVALIDATE_INDEX = -1;

    // create index when read data

    int data_index[101];

    memset(data_index,INVALIDATE_INDEX,sizeof(data_index));

 

    StStudent arr[10];

    // start read data

    int tmp[10] = {10,23,34,83,28,25,82,73,92,13};

    for (int i= 0; i<10; ++i)

    {

        StStudent student;

        student.no = StringTools::toString(tmp[i]);

        student.score = i*10+5// score assignment

        arr[i] = student;

        // build index for item

        data_index[tmp[i]] = i;

    }

    // 1.input find NO.

    int findNo = 34;

    // 2.find index

    int findIndex = data_index[findNo];

    if (findIndex == INVALIDATE_INDEX)

    {

        cout<<"can not find NO."<<endl;

    }

    else

    {

        StStudent findItem = arr[findIndex];

        printStudent(findItem);

    }

 

    return 0;

}

student 34 score: 25

Program ended with exit code: 0

 

 

 

 

02-对不重复的一组数据查找

原文:http://www.cnblogs.com/sharpfeng/p/5141956.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!