応用情報技術者試験掲示板

掲示板検索:
スレッド一覧

シノニムの発生[1432]

なんでさん(No.1)

https://www.ap-siken.com/bunya.php?m=2&s=2&no=60

この問題についてですが、参考書では「イ」だとシノニムが発生するからと記載がありますが、
どちらが正しいのでしょうか?

自分の意見としてはキーの範囲は1〜16なのでシノニムなんて起こらないと思うので、サイト派です。

2019.01.12 19:08
双葉さん(No.2)

>Xは値1〜256を一様にとり,Yは値1〜16を一様にとる
と問題文にあることから、「2整数X,Yをキーとするデータ」は一つではなくて
複数あるようですね。そもそも入力データが複数ないと、ハッシュ関数で分ける
意味がありませんから。

すると、選択肢の「イ」はハッシュ値は16通りにしかならず、17回データの
入力が発生すれば、必ずシノニムが発生することになります。

2019.01.12 19:39
助け人さん(No.3)

私はこう考えました。

ア〜エは、いずれもシノニムが発生しますが、最もシノニムが発生するものはどれかが問われていると。

解説に少し疑問がありますので、別スレで管理人様に問い合わせます。

2019.01.12 20:00
双葉さん(No.4)

補足説明ありがとうございます。
ア〜エはどれもシノニムが発生しますが、その頻度が最も高い「イ」が「最も不適切」と
考えています。他に不適切の候補を挙げるならば、ハッシュ値の頻度が偏る「エ」でしょうが、
それよりも、シノニム発生が多い「イ」だと見ています。

実験用プログラムをC#でコーディングしましたので、環境がある方はコンパイルして
やってみてもらえればと思います。コンソールアプリケーションです。
以下、実験用コード

using System;
namespace abc
{
    class ex
    {
        static void Main(string[] args)
        {
            int[] ha = new int[256];
            int[] hi = new int[256];
            int[] hu = new int[256];
            int[] he = new int[256];
            int n = 256;

            for (int x = 1; x <= 256; x++)
            {
                for (int y = 1; y <= 16; y++)
                {
                    ha[x % n]++;
                    hi[y % n]++;
                    hu[(x + y) % n]++;
                    he[(x * y) % n]++;
                }
            }

            Console.WriteLine("ハッシュ値と生成回数の関係");
            Console.WriteLine("値\tア\tイ\tウ\tエ");
            for (int i = 0; i < 256; i++)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", i,ha[i],hi[i],hu[i],he[i]);
            }

            Console.ReadLine();
        }
    }
}

2019.01.12 21:34

【返信投稿用フォーム】

お名前(10文字以内)

顔アイコン


本文(2000文字以内)

記事削除用パスワード(8文字以内)

プレビュー

※宣伝や迷惑行為を防止するため当サイトとIPAサイト以外のURLを含む記事の投稿は禁止されています。

投稿記事削除用フォーム

投稿No. パスワード 
© 2010-2019 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop