Solved

How to reduce the "for" loop?

Posted on 1998-10-15
11
217 Views
Last Modified: 2010-04-15
Hi,
  I have a question on the "for" loop.
The code is:
               for(i=0;i<256;j++){
                   for(j=0; j<256; j++){
                       for(k=0; k<256; k++){
                             temp[i][j][k]=0;
                                 }}}
How can I implement the above code by using other fast
method as the 3 "for" loops are very very slow.
Also, can I use the fast method to extend in 4 or more
"for" loops?
Thanks

0
Comment
Question by:gorexy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
  • 3
11 Comments
 
LVL 6

Accepted Solution

by:
thresher_shark earned 100 total points
ID: 1253575
Answer coming....
0
 
LVL 6

Expert Comment

by:thresher_shark
ID: 1253576
You can use the memset function to set every data member of an array to zero.  In your case, it looks like you can put this:

for (i = 0; i < 256; i++)
{ for (j = 0; j < 256; j++)
  { memset (temp[i][j], 0, 256); }
}

in place of your above code.  That should speed it up some.  Unfortunately, when dealing with large arrays such as the one you have, the functions that come with the compiler may not be sufficient to handle the large numbers.  For example, the optimal situation would be to use the memset function to fill every member of the array in one sweep:

memset (temp, 0, 16777216);

This would fill the entire "temp" array at once, and would no doubt be faster than the method you are currently employing.  However that is not the case.
0
 
LVL 6

Expert Comment

by:thresher_shark
ID: 1253577
Perhaps a redesign of your current requirement for the large array is in order.  Can you please elaborate on your program and what you are doing with this large loop?  Often an alternative method can be found.

In any case, if my above solution (the first one) does not speed it up sufficiently, I think I have a few other ideas, so please feel free to ask.  Thanks!
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 84

Expert Comment

by:ozo
ID: 1253578
memset( temp[i][j], 0, 256*sizeof(temp[0][0][0]) );

(It may also be possible to redesign the algorithm not to require initialization)
0
 

Author Comment

by:gorexy
ID: 1253579
Hm...can all the experts send e-mail to me?
Because I seldom check the expert-change web site.
Thanks  my e-mail:00420200@cpccux0.cityu.edu.hk
Alex
0
 
LVL 6

Expert Comment

by:thresher_shark
ID: 1253580
gorexy - Can you simply check the email notification button?  Then you are informed as to when the page is added to (i.e. comments and answers).
0
 

Author Comment

by:gorexy
ID: 1253581
OK thresher_shark!
Hm... actually I got a series of number ,for example, 11231236
I would like to treat consecutive 3 numbers as a single unit and count
the number of times that it appears.  For example, 112 -> 1 times
123->2 times, 231-> 1times, 312 -> 1 times, 236 -> 1 times and 361 -> 1 times.
so I am stupid to put them as a 3 dimensional array and count all the combination
So any good suggestions?
Thanks
0
 
LVL 84

Expert Comment

by:ozo
ID: 1253582
You can put them in a hash table.
You can put them in a [10][10]]10] array, which would be much faster to initialize than a [256][256][256] array,
Or you can just put then in a [1000] array
0
 

Author Comment

by:gorexy
ID: 1253583
I need to consider all 256 ASCII code and so I need to initialize [256][256][256]!
How I use [1000] array?  The file length is quite long.
0
 
LVL 84

Expert Comment

by:ozo
ID: 1253584
Didn't you say 3 numbers, i.e. digits?

If you need to count all character combinations, you could use a [16777216] array, which could be initialized in a single memset call,
But a hash table may be even better if the array is likely to be sparse.

There's also a trick to defer any initialization until you need it if you have space for two more arrays:

int a[16777216],b[16777216];
int n=0;

if( a[i]>=n || b[a[i]] != i ){
     /* temp[i] needs initialization */
    a[i] = n;
    b[n] = i;
    n++;
    temp[i] = 0;
}
/* temp[i] has been initiialized */
temp[i]++;


But this may end up being slower over all
0
 

Author Comment

by:gorexy
ID: 1253585
Thanks all the experts.  After counting the elements. I need to
do something else.  The code is as follows:

for (i=0; i<256; i++)
  for(j=0; j<256; j++)
    for(k=0; k<256; k++)
          sum+=count[i][j][k]
          count=sum-count[i][j][k]
}}}
So any imporvement I can make?
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question