分からない点
入力を受け取り、被りがない場合は受け取った入力の番号を出力するという処理を①Listを用いた場合と②HashSetを用いた場合とで行いました。
同じような処理を行っているつもりですが、処理速度に非常に差異が生まれました(②の方が高速)
※コードは後述します
何故このような差異が生まれたのか自分には理解できないので、教えていただけないでしょうか?
自分の予想
①Listを用いた処理のif文の判別式に含まれる
C#
1list.Contains(input);
の処理は、list内に含まれる要素をインデックス番号が0から順に確認していくため、listに含まれる要素数が増加すると処理量が増加するのではないか??
問題文
文字列 S を1行ずつ N 回受け取ります。 i (1 <= i <= N) 番目の文字列 Si が i-1 番目までの入力された文字列と被っていない場合 i を出力してください。
制約
1 <= N <= 10^5 Si (1 <= i <= N)は英小文字および数字からなる 1 文字以上 15 文字以下の文字列 ※正規表現では[a-z0-9]{1,15}で表せる
入力
N S1 S2 : SN
出力
i 番目の文字列 Si が i-1 番目までに被りがない場合、 i を出力
①Listを使った処理
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.IO; 5 6namespace AtCoder 7{ 8 class Problem 9 { 10 static void Main() 11 { 12 // Step1. Nを受け取る 13 var N = int.Parse(Console.ReadLine()); 14 15 // Step2. 要素をメモするListを作成する 16 var list = new List<string>(); 17 18 // Step3. 入力を受け取り、Listに含まれていない場合のみ追加&番号出力 19 for (int i = 0; i < N; i++) 20 { 21 var input = Console.ReadLine(); 22 if (!list.Contains(input)) 23 { 24 Console.WriteLine(i+1); 25 list.Add(input); 26 } 27 } 28 } 29 } 30}
②HashSetを使った処理
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.IO; 5 6namespace AtCoder 7{ 8 class Problem 9 { 10 static void Main() 11 { 12 // Step1. Nを受け取る 13 var N = int.Parse(Console.ReadLine()); 14 15 // Step2. 要素をメモするHashSetを作成する 16 var list = new HashSet<string>(); 17 18 // Step3. 入力を受け取り、HashSetに含まれていない場合のみ番号を出力 19 for (int i = 0; i < N; i++) 20 { 21 var input = Console.ReadLine(); 22 if (list.Add(input)) 23 { 24 Console.WriteLine(i+1); 25 } 26 } 27 } 28 } 29}
他の質問もそうだけど、単に回答者を試そうとしてるだけじゃないの?
それか自分の別アカウントにスコアをつけるためか。
質問が不自然すぎる。
回答2件
あなたの回答
tips
プレビュー