Requirement: enter a string to count the number of words. Words are separated by spaces. Multiple spaces are allowed. Algorithm .
Example: input: I love China
Output:
I:1
Love:2
China:1
First, we thought of a simulated method. We used struct to cache the words that have appeared, and then input the text to traverse the new words to traverse the struct, check whether the word has been saved for related processing.
If n letters are in the input text and m are not repeated, the algorithm complexity is O (NM ^ 2), preferably M = 1, the worst case is M = n.CodeAs follows:
1 # Include <stdio. h>2 # Include < String . H> 3 Struct Struct_words { 4 Char Word [ 20 ]; 5 Int Count; 6 }; 7 Int Main (){ 8 Char String [ 100 ]; 9 Char C; 10 Struct Struct_words words [ 20 ]; 11 Int I = 0 , K =0 , Ws = 0 ; 12 13 For (; I < 20 ; I ++ ){ 14 Words [I]. Word [ 0 ] = ' \ 0 ' ; 15 Words [I]. Count =0 ; 16 } 17 Puts ( " Please input words. " ); 18 Gets ( String ); 19 Puts ( " =============== Start to take the word ============================ " ); 20 21 I = 0 ; 22 Do { 23 C = String [I]; 24 If (C! = ' ' & C! = ' \ 0 ' ){ 25 Words [K]. Word [WS] = C; 26 Words [K]. Count = 1 ; 27 WS ++ ; 28 } Else { 29 Words [K]. Word [WS] =' \ 0 ' ; 30 Ws = 0 ; 31 K ++ ; 32 } 33 I ++ ; 34 } While (C! =' \ 0 ' ); LDA 35 36 37 Puts ( " ============= Merge the same words ================ " ); 38 For (I = 0 ; Words [I]. Word [ 0 ]! = ' \ 0 ' ; I ++ ){ 39 Puts (words [I]. Word ); 40 If (Words [I]. Count> = 1 ) 41 For (K = I; words [K]. Word [ 0 ]! = ' \ 0 ' ; K ++){ 42 If (Strcmp (words [I]. Word, words [K]. Word) = 0 43 & Words [K]. Count = 1 ){ 44 Words [K]. Count -- ; 45 Words [I]. Count ++ ; 46 } 47 } 48 } 49 50 Puts ( " ==================== End ================== " ); 51 For (I = 0 ; Words [I]. Word [ 0 ]! = ' \ 0 ' ; I ++ ){ 52 If (Words [I]. Count! = 0 ) 53 Printf ( " % S: \ t % d \ n " , Words [I]. Word, words [I]. Count ); 54 } 55 Return ( 0 ); 56 }
Then, to optimize the word cache and the statistics on the number of occurrences of words, you must traverse the user input text. However, the hash algorithm can be used to optimize the word cache and the number of occurrences, by leveraging the features of the hash algorithm, the complexity is immediately reduced to O (n). The implementation code is as follows:
1 # Include <stdio. h> 2 # Include < String . H> 3 # Define N 100 4 5 Struct Struct_words { 6 Char Word [ 100 ]; 7 Int Count; 8 }; 9 10 Int Hash ( Char * Key) 11 { 12 Unsigned Long H = 0 ; 13 While (* Key) 14 { 15 H = (H < 4 ) + * Key ++ ; 16 Unsigned Long G = H &0xf0000000l ; 17 If (G) 18 H ^ = G> 24 ; 19 H & = ~ G; 20 } 21 Return H & N; 22 } 23 Int Main (){ 24 Char String [ 1000 ]; 25 Char Current_word [ 100 ]; 26 Char C; 27 Struct Struct_words words [ 200 ]; 28 Int I = 0 , K = 0 , Ws = 0 , Key; 29 Int Keys [ 100 ]; 30 31 For (; I < 200 ; I ++ ){ 32 Words [I]. Word [ 0 ] = ' \ 0 ' ; 33 Words [I]. Count = 0 ; 34 } 35 Puts (" ============== Enter some words and separate them with spaces ========================== " ); 36 Gets ( String ); 37 38 I = 0 ; 39 Do { 40 C = String [I]; 41 // If there is a space before the first word, skip 42 If (Ws = 0 & C = ' ' ) {I ++; Continue ;} 43 If (C! = ' ' & C! = ' \ 0 ' ){ 44 Current_word [WS] = C; 45 WS ++ ; 46 } Else { 47 Current_word [WS] = ' \ 0 ' ; 48 Key = Hash (current_word ); 49 If (Words [Key]. Count = 0 ){ 50 Strcpy (words [Key]. Word, current_word ); 51 Keys [k] = Key; 52 K ++ ; 53 } 54 Words [Key]. Count ++ ; 55 Ws = 0 ; 56 } 57 I ++ ; 58 } While (C! = ' \ 0 ' ); 59 60 Printf ( " % D " , K ); 61 Puts ( " =====================Print the result ====================== " ); 62 For (I = 0 ; I <K; I ++ ){ 63 Printf ( " % S: \ t % d \ n " , Words [Keys [I]. Word, words [Keys [I]. Count ); 64 } 65 Puts ( " ==================== End ================== " ); 66 Return 0 ; 67 }
Source: http://www.cnblogs.com/amboyna/archive/2009/12/05/1617387.html