C++ program to find Second most repeated word in a sequence

We are given an array of words, and we need to find the word whose frequency is the second largest in the array.

Let?s assume some simple input and output scenarios

Let?s assume we are having an array which consists of elements like ["point," "world," "articles," "articles," "articles," "world," "world," "world," "point"].

The frequency of words are ?

"point": 2
"world": 4
"articles": 3 // This will be the second most repeated word in the array.

So the second most repeated word is "articles," and our output is "articles."

Let?s consider another scenario, Where there are group of similar words in an array, for example ["abc", "abc", "abc", "bab", "bab", "cat"]. The second most repeated word in sequence will be "bab".

"abc" = 3
"bab" = 2 // This will be the second most repeated word in the array.
"cat" = 1

We can hash and find the frequencies of each word in the given array of words and then return the second greater. In C++, we can use the unordered_map data structure.

Algorithm

The following are steps to be followed to perform the task

  • Implement a hash table.

  • The frequency of each string in the vector should be stored in hash table.

  • Traverse the hash table after storing each string in hash table to find the string having second highest frequency.

  • Then, print the string as output

Example

The C++ implementation to find the second most frequent word in a list is as follows ?

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><unordered_map></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
string <span class="token function">solve</span><span class="token punctuation">(</span>vector<span class="token operator"><</span>string<span class="token operator">></span> words<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   unordered_map<span class="token operator"><</span>string<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> hash<span class="token punctuation">;</span>
   <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> word<span class="token operator">:</span> words<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      hash<span class="token punctuation">[</span>word<span class="token punctuation">]</span><span class="token operator">++</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">int</span> first_max <span class="token operator">=</span> INT32_MIN<span class="token punctuation">,</span> sec_max <span class="token operator">=</span> INT32_MIN<span class="token punctuation">;</span>
   <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> it<span class="token operator">:</span> hash<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>it<span class="token punctuation">.</span>second <span class="token operator">></span> first_max<span class="token punctuation">)</span> <span class="token punctuation">{</span>
         sec_max <span class="token operator">=</span> first_max<span class="token punctuation">;</span>
         first_max <span class="token operator">=</span> it<span class="token punctuation">.</span>second<span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>it<span class="token punctuation">.</span>second <span class="token operator">></span> sec_max <span class="token operator">&&</span> it<span class="token punctuation">.</span>second <span class="token operator">!=</span> first_max<span class="token punctuation">)</span> <span class="token punctuation">{</span>
         sec_max <span class="token operator">=</span> it<span class="token punctuation">.</span>second<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> it<span class="token operator">:</span> hash<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>it<span class="token punctuation">.</span>second <span class="token operator">==</span> sec_max<span class="token punctuation">)</span> <span class="token punctuation">{</span>
         <span class="token keyword">return</span> it<span class="token punctuation">.</span>first<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">return</span> <span class="token string">""</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   vector<span class="token operator"><</span>string<span class="token operator">></span> words <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">"point"</span><span class="token punctuation">,</span> <span class="token string">"world"</span><span class="token punctuation">,</span> <span class="token string">"articles"</span><span class="token punctuation">,</span> <span class="token string">"articles"</span><span class="token punctuation">,</span> <span class="token string">"articles"</span><span class="token punctuation">,</span> <span class="token string">"world"</span><span class="token punctuation">,</span> <span class="token string">"world"</span><span class="token punctuation">,</span> <span class="token string">"world"</span><span class="token punctuation">,</span> <span class="token string">"point"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">solve</span><span class="token punctuation">(</span>words<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

"articles"

Conclusion

We can also use maps in C++, but it is useless as we don?t want our words to be sorted lexicographically when hashed. Using the map will also be expensive as the insert operation takes O(log(n)) while in unordered_map, it takes O(1). For bigger input, though, we have to write our custom hash function to avoid conflicts and keep the time complexity O(1) only.

Updated on: 2022-08-10T09:52:54+05:30

544 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements