查找数组

时间:2017-02-10 03:55:12

标签: c++ arrays search

编辑 采取不同的方法并找到解决方案,更新功能以正确查找模式

我一直都在使用这个算法,我已经查看了大约12个代码示例10倍,但似乎没有一个能够解决我的问题。

问题:查找数组中的模式,如果数组有多个模式,则全部显示。 (这是一个家庭作业,所以我必须使用数组/指针)

示例数组: -1,-1,5,6,1,1

示例输出: 该数组具有以下模式:-1,1

我遇到的问题是试图找出如何存储和显示最高模式或多种模式(如果存在)。

我使用了很多方法,因此我将发布我最近的方法:

void getMode(int *arr, int size)
{
    int *count = new int[size]; // to hold the number of times a value appears in the array

    // fill the count array with zeros
    for (int i = 0; i < size; i++)
        count[i] = 0;

    // find the possible modes
    for (int x = 0; x < size; x++)
    {
        for (int y = 0; y < size; y++)
        {
            // don't count the values that will always occur at the same element
            if (x == y)
                continue;

            if (arr[x] == arr[y])
                count[x]++;
        }
    }

    // find the the greatest count occurrences
    int maxCount = getMaximum(count, size);

    // store only unique values in the mode array
    int *mode = new int[size]; // to store the mode(s) in the list
    int modeCount = 0; // to count the number of modes
    if (maxCount > 0)
    {
        for (int i = 0; i < size; i++)
        {
            if (count[i] == maxCount)
            {
                // call to function searchList
                if (!searchList(mode, modeCount, arr[i]))
                {
                    mode[modeCount] = arr[i];
                    modeCount++;
                }
            }
        }
    }

    // display the modes
    if (modeCount == 0)
        cout << "The list has no mode\n";
    else if (modeCount == 1)
    {
        cout << "The list has the following mode: " << mode[0] << endl;
    }
    else if (modeCount > 1)
    {
        cout << "The list has the following modes: ";

        for (int i = 0; i < modeCount - 1; i++)
        {
            cout << mode[i] << ", ";
        }
        cout << mode[modeCount - 1] << endl;
    }

    // delete the dynamically allocated arrays
    delete[]count;
    delete[]mode;
    count = NULL;
    mode = NULL;
}

/*
    definition of function searchList.
    searchList accepts a pointer to an int array, its size, and a value to be searched for as its arguments.
    if searchList finds the value to be searched for, searchList returns true.
*/

bool searchList(int *arr, int size, int value)
{
    for (int x = 0; x < size; x++)
    {
        if (arr[x] == value)
        {
            return true;
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:0)

最好从较小的构建块构建算法。标准<algorithm>库是此类组件的重要来源。即使您没有使用它,该程序也应该与子程序结构相似。

至少对于家庭作业而言,该计划背后的推理应该是相当“明显的”,特别是给出了一些评论。

以下是使用<algorithm>std::unique_ptr代替new的版本,您永远不应该使用该版本。如果它有助于满足作业要求,您可以实现自己的标准库设施版本。

// Input: array "in" of size "count"
// Output: array "in" contains "count" modes of the input sequence
void filter_modes( int * in, int & count ) {
    auto end = in + count;
    std::sort( in, end ); // Sorting groups duplicate values.

    // Use an ordered pair data type, <frequency, value>
    typedef std::pair< int, int > value_frequency;
    // Reserve memory for the analysis.
    auto * frequencies = std::make_unique< value_frequency[] >( count );
    int frequency_count = 0;

    // Loop once per group of equal values in the input.
    for ( auto group = in; group != end; ++ group ) {
        auto group_start = group;

        // Skip to the last equal value in this subsequence.
        group = std::adjacent_find( group, end, std::not_equal_to<>{} );

        frequencies[ frequency_count ++ ] = { // Record this group in the list.
            group - group_start + 1, // One unique value plus # skipped values.
            * group // The value.
        };
    }

    // Sort <frequency, value> pairs in decreasing order (by frequency).
    std::sort( frequencies.get(), frequencies.get() + frequency_count, 
               std::greater<>{} );

    // Copy modes back to input array and set count appropriately.
    for ( count = 0; frequencies[ count ].first == frequencies[ 0 ].first; ++ count ) {
        in[ count ] = frequencies[ count ].second;
    }
}

答案 1 :(得分:0)

由于模式的定义方式,没有真正的答案。偶尔你会在英国高中留下考试,要求从一个明显是amodal的小分布中识别模式,但是有一个数量过多的bin。

您需要对数据进行分区,选择分档以使数据具有明确的峰值和低谷。然后模式是峰的尖端。然而,在通往顶部的路上很少有辅助峰值不是模式,它们表明您的分箱过于狭窄。它很容易让人眼前一亮,在计算机算法中更难以解决这个模式,这种算法必须是正式的。一个测试是将箱子移动半个箱子。如果一个模式消失,它就是噪音而不是真实模式。