02-對不重複的一組數據查找

假如10個學生數據(學號 成績)不重複,查找數據的思路:ios

1.從頭至尾順序遍歷。O(N)數組

2.排序後,二分查找。O(logN)大數據

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

 

如何創建索引?spa

此處假設學生學號數據類型int,範圍【0,100】。3d

學生的學號做爲數據存放數組的索引下標。code

實際狀況中,學號每每以字符串方式存在,數據也多位於文件中,則能夠將字符串和文件中地址位置進行關聯。查找時,經過字符串查找到文件地址,進而直接獲取數據便可。由於學號具備惟一性,因此將學號和地址做爲一對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

相關文章
相關標籤/搜索