使用大于3000万的数据输入时,程序不会将数据输出到控制台

时间:2015-06-23 09:14:26

标签: c++ vector console-application binary-search-tree dynamic-memory-allocation

我试图制作一个程序,通过使用二叉搜索树和向量来最终显示与大数据输入的运行时差异。但在我开始之前,我正在测试插入和搜索功能是否正常工作。它似乎很好,但每当我将SIZE指定为3000万或更多时,大约10-20秒后,它将只显示Press any key to continue...没有输出。但是,如果我将SIZE指定为等于或大于2000万,则会在编程时输出搜索结果。那么您认为导致这个问题的是什么?

一些旁注:

我将随机生成的唯一(无重复)值存储到树中以及向量中。所以最后,树和向量都将具有完全相同的值。当程序运行搜索部分时,如果在BST中找到一个值,那么它也应该在向量中找到。到目前为止,当使用2000万或更少的值时,这没有任何问题。

另外,我使用randValue = rand() * rand();生成随机值,因为我知道rand()的最大值是32767.因此,将它自身相乘将保证0到1,073,741,824之间的数字范围。我知道我使用的插入和搜索方法效率低下,因为我确保没有重复,但现在不是我的问题。这只是为了我自己的实践。

为了简单起见,我只发布了我的main.cpp。如果您认为问题出在我的其他文件中,我会发布其余文件。

这是我的main.cpp:

#include <iostream>
#include <time.h>
#include <vector>
#include "BSTTemplate.h"
#include "functions.h"

using namespace std;

int main()
{
    const long long SIZE = 30000000;
    vector<long long> vector1(SIZE);
    long long randNum;
    binarySearchTree<long long> bst1;
    srand(time(NULL));

    //inserts data into BST and into the vector AND makes sure there are no duplicates
    for(long long i = 0; i < SIZE; i++)
    {
        randNum = randLLNum();
        bst1.insert(randNum);
        if(bst1.numDups == 1)//if the random number generated is duplicated, don't count it and redo that iteration
        {
            i--;
            bst1.numDups = 0;
            continue;
        }
        vector1[i] = randNum;
    }

    //search for a random value in both the BST and the vector
    for(int i = 0; i < 5; i++)
    {
        randNum = randLLNum();
        cout << endl << "The random number chosen is: " << randNum << endl << endl;

        //searching with BST
        cout << "Searching for " << randNum << " in BST..." << endl;
        if(bst1.search(randNum))
            cout << randNum << " = found" << endl;
        else
            cout << randNum << " = not found" << endl;

        //searching with linear search using vectors
        cout << endl << "Searching for " << randNum << " in vector..." << endl;
        if(containsInVector(vector1, SIZE, randNum))
            cout << randNum << " = found" << endl;
        else
            cout << randNum << " = not found" << endl;
    }

    cout << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

(根据OP的要求将评论转贴为答案)

选项包括:编译64位(如果你还没有 - 根据RAM或地址空间是否有问题可能会变得更好或更差),购买更多内存,调整操作系统的交换内存设置(让它使用)更多的磁盘),设计一个更节省内存的树(但最多你可能只会得到一个数量级的改进,可能更少,它可能会影响其他的东西,如性能特征),重新设计你的树,以便手动保存数据到磁盘并将其读回(例如使用LRU)。

这是在VC ++上编译64位的方法:msdn.microsoft.com/en-us/library/9yb4317s.aspx