Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

ソート済み配列における絶対値の異なる要素数を数える方法

この記事では、配列内の要素のうち、絶対値が異なる要素がいくつあるかを数える方法を解説します。例えば、配列に {5, 5, 6, -5, 8, 2, -2, 1} という8つの要素が含まれているとします。しかし、絶対値で見ると {5, 6, 8, 2, 1} の5種類しか存在しません。-5 と 5 は符号が異なるだけで、絶対値としては同じ値であるため、別々の要素とはみなされません。

この問題を解決するには、Set(セット)データ構造を利用するのが効果的です。セットには重複した要素を格納できないという特性があります。そこで、配列の各要素をセットに挿入する際に、絶対値に変換してから挿入することで、自動的に重複が排除されます。

アルゴリズム

absoluteDistinctCount(arr)

begin
    define set s;
    for each element e in arr, do
        insert |e| into s
    done
    return the number of elements of s
end

アルゴリズムの流れ

1. 空のセット s を定義します。
2. 配列 arr の各要素 e について、その絶対値 |e| をセット s に挿入します。
3. 最後に、セット s の要素数を返します。これが絶対値の異なる要素の個数となります。

実装例(C++)

#include<iostream>
#include<set>
#include<cmath>
using namespace std;
int absoluteDistinctCount(int arr[], int n){
    set<int> s;
    for(int i = 0; i<n; i++){
        s.insert(abs(arr[i])); // 絶対値を挿入
    }
    return s.size();
}
main() {
    int arr[] = {5, 5, 6, -5, 8, 2, -2, 1};
    int n = (sizeof(arr))/(sizeof(arr[0]));
    cout << "Absolute Distinct Count: " << absoluteDistinctCount(arr, n);
}

実行結果

Absolute Distinct Count: 5

計算量について

このアルゴリズムの時間計算量は O(n log n) です。各要素のセットへの挿入には O(log n) の時間がかかり、それを n 個の要素に対して行うためです。空間計算量は O(n) となり、最悪の場合すべての要素がセットに格納されます。

なお、配列がすでにソートされている場合は、セットを使わずに両端からポインタを移動させながら比較する手法(Two Pointers テクニック)を用いることで、O(n) の時間計算量・O(1) の空間計算量で解くことも可能です。

  1. JavaScriptの配列で、指定した数値より上または下の要素数をカウントする方法

    はじめにJavaScriptでは、配列内の各要素が特定の基準値より「下」なのか「以上」なのかを一括で判定し、それぞれの件数を数えたいケースがあります。本記事では、reduce() メソッドを活用したシンプルで効率的な実装方法を解説します。対象となるデータまず、次のような数値の配列を考えてみましょう。const array = [54,54,65,73,43,78,54,54,76,3,23,78];この配列に対して、指定した数値よりも小さい要素がいくつあるか、基準値以上の要素がいくつあるかをカウントする関数を作成します。たとえば基準値が 50 の場合、50未満の要素は 43・3・23 の 3つ

  2. C言語で配列の重複を削除し、ソート済みの一意な要素を出力する方法

    整数型の要素を持つ配列が与えられたとき、重複する値を取り除き、一意な(distinct)要素だけをソートして出力するのが本記事の目的です。例として、次のような整数値を格納した配列を考えてみましょう。4, 6, 5, 3, 4, 5, 2, 8, 7, 0この配列を単純にソートすると「0, 2, 3, 4, 4, 5, 5, 6, 7, 8」となりますが、この結果にはまだ重複値である 4 と 5 が含まれています。これらを削除し、最終的な出力結果は次のようになります。0, 2, 3, 4, 5, 6, 7, 8入力と出力の例Input: array[] = {4, 6, 5, 3, 4, 5,