@Anand Shastri, if tasks enter randomly in runtime, structure needs to add a member start_time, which will be different from reference_time (till now u been considering it as same start time of every task). finally GOOD work!!
surender On Fri, Aug 5, 2011 at 9:42 AM, Gaurav Menghani <gaurav.mengh...@gmail.com>wrote: > Then that has to be mentioned in the question. Premature optimization > is the root of all evil, in the words of Don Knuth. > > On Fri, Aug 5, 2011 at 9:38 AM, Anand Shastri <anand.shastr...@gmail.com> > wrote: > > what if new task gets added every time. > > > > On Thu, Aug 4, 2011 at 8:24 PM, Gaurav Menghani < > gaurav.mengh...@gmail.com> > > wrote: > >> > >> Instead of a heap, sort the array once. Pick the first element every > >> time, and remove it from the array, or just move the 'head pointer' > >> ahead. > >> > >> On Fri, Aug 5, 2011 at 8:01 AM, Anand Shastri < > anand.shastr...@gmail.com> > >> wrote: > >> > /* Create a Timer Task that takes in the running time and it's > >> > associated > >> > function to be called after its running time is elapsed */ > >> > #include <time.h> > >> > > >> > #define NUM 5 > >> > typedef void (*funcToBeCalled)(void); > >> > > >> > typedef struct timer TIMER; > >> > > >> > struct timer > >> > { > >> > int runningTime; > >> > funcToBeCalled func; > >> > }; > >> > > >> > static TIMER timerArray[NUM]; > >> > static time_t reference; > >> > static int count; > >> > > >> > int LEFT(int index) > >> > { > >> > if(index < NUM) > >> > return (index * 2 + 1); > >> > } > >> > int RIGHT(int index) > >> > { > >> > if(index < NUM) > >> > return (index * 2 + 2); > >> > } > >> > static void print(void) > >> > { > >> > printf("Timer task has been called\n"); > >> > } > >> > > >> > // Initialise the timer data structure > >> > void Init() > >> > { > >> > int index; > >> > count = NUM; > >> > // Note down the reference time > >> > reference = time(0); > >> > printf("reference : %ld\n", reference); > >> > > >> > // Initialise the data structure such that associate function gets > >> > // called after 3, 6, 9, 12, 15 seconds respectively. > >> > for(index = 0; index < count; index++) > >> > { > >> > timerArray[index].runningTime = (index + 1) * 3; > >> > timerArray[index].func = print; > >> > } > >> > } > >> > > >> > // This function check the min heap property and arrange > >> > // the element such that at every node, root node should be > >> > // less than its right and left child element. > >> > Heapify(int index) > >> > { > >> > int left, right, minIndex; > >> > TIMER temp; > >> > left = LEFT(index); > >> > right = RIGHT(index); > >> > if(left < (count) && > >> > (timerArray[left].runningTime < timerArray[index].runningTime)) > >> > { > >> > minIndex = left; > >> > } > >> > else > >> > { > >> > minIndex = index; > >> > } > >> > if(right < (count) && > >> > (timerArray[right].runningTime < > timerArray[minIndex].runningTime)) > >> > { > >> > minIndex = right; > >> > } > >> > if(minIndex != index) > >> > { > >> > temp.runningTime = timerArray[index].runningTime; > >> > temp.func = timerArray[index].func; > >> > > >> > timerArray[index].runningTime = timerArray[minIndex].runningTime; > >> > timerArray[index].func = timerArray[minIndex].func; > >> > > >> > timerArray[minIndex].runningTime = temp.runningTime; > >> > timerArray[minIndex].func = temp.func; > >> > > >> > Heapify(minIndex); > >> > } > >> > } > >> > > >> > // This function builds the MIN heap data structure > >> > void BuildHeap() > >> > { > >> > int len, i; > >> > len = sizeof(timerArray)/sizeof(timerArray[0]); > >> > i = (len - 1)/2; > >> > while(i >= 0) > >> > { > >> > Heapify(i); > >> > i--; > >> > } > >> > Heapify(0); > >> > } > >> > > >> > > >> > // This function extract the top element of the heap > >> > // Min heap has the min element at the top always. > >> > int HeapExtract() > >> > { > >> > TIMER temp; > >> > // Swap the 0 the element with last element of the array > >> > temp.runningTime = timerArray[0].runningTime; > >> > temp.func = timerArray[0].func; > >> > > >> > timerArray[0].runningTime = timerArray[count-1].runningTime; > >> > timerArray[0].func = timerArray[count-1].func; > >> > > >> > timerArray[count-1].runningTime = temp.runningTime; > >> > timerArray[count-1].func = temp.func; > >> > count--; > >> > // Check the heap property heapify if it got violated > >> > Heapify(0); > >> > // return the minimum element of the heap > >> > return (count); > >> > } > >> > void scheduler() > >> > { > >> > time_t now; > >> > int diff_time, minIndex; > >> > while(count >= 0) > >> > { > >> > now = time(0); > >> > printf("Current Time: %ld\n", time(0)); > >> > diff_time = now- reference; > >> > printf("diff_time : %ld\n", diff_time); > >> > if(diff_time >= timerArray[0].runningTime) > >> > { > >> > minIndex = HeapExtract(); > >> > timerArray[minIndex].func(); > >> > } > >> > else > >> > { > >> > sleep(timerArray[0].runningTime - diff_time); > >> > } > >> > } > >> > } > >> > main() > >> > { > >> > int index, minIndex; > >> > TIMER temp; > >> > > >> > // Initialise the data structure > >> > Init(); > >> > > >> > // Build MIn heap data structure > >> > BuildHeap(timerArray); > >> > > >> > // Run the scheduler > >> > scheduler(); > >> > > >> > return; > >> > } > >> > The ouput of above code is > >> > > >> > Timer Task is about to run > >> > reference : 1312510772 > >> > > >> > Current Time: 1312510775 > >> > diff_time : 3 > >> > Timer task has been called > >> > > >> > Current Time: 1312510778 > >> > diff_time : 6 > >> > Timer task has been called > >> > Current Time: 1312510781 > >> > diff_time : 9 > >> > Timer task has been called > >> > > >> > Current Time: 1312510784 > >> > diff_time : 12 > >> > Timer task has been called > >> > > >> > Current Time: 1312510787 > >> > diff_time : 15 > >> > Timer task has been called > >> > > >> > Please share your comments > >> > > >> > On Thu, Aug 4, 2011 at 11:43 AM, Anand Shastri > >> > <anand.shastr...@gmail.com> > >> > wrote: > >> >> > >> >> Obviously you need to run the task that a closet running time. > >> >> > >> >> For Example > >> >> > >> >> Task 1 : running time = 2 secs > >> >> > >> >> Task 2: running time = 4 secs > >> >> > >> >> This means I want to run the task 1 after 2 secs and task 2 after 4 > >> >> second. > >> >> > >> >> How I hope the question is clear to you know > >> >> > >> >> On Thu, Aug 4, 2011 at 11:37 AM, mohit verma <mohit89m...@gmail.com> > >> >> wrote: > >> >>> > >> >>> there is nothing like "search min or max time and then call > function" > >> >>> given . It can be the case: "call the functions in order of nodes or > >> >>> times > >> >>> saved in objects". M i wrong? > >> >>> > >> >>> On Thu, Aug 4, 2011 at 11:56 PM, Anand Shastri > >> >>> <anand.shastr...@gmail.com> wrote: > >> >>>> > >> >>>> You mean to say linked to maintain all time task with its > >> >>>> corresponding > >> >>>> running time and associate function. In that case how will find the > >> >>>> task > >> >>>> which has the closed running time. > >> >>>> > >> >>>> If you use min heap it would be easy to find the task that has > >> >>>> closest > >> >>>> runing time in O(1) complexity. > >> >>>> > >> >>>> On Thu, Aug 4, 2011 at 10:57 AM, mohit verma < > mohit89m...@gmail.com> > >> >>>> wrote: > >> >>>>> > >> >>>>> why are u maintaining heap? can't we use link list here? > >> >>>>> > >> >>>>> On Thu, Aug 4, 2011 at 11:16 PM, Anand Shastri > >> >>>>> <anand.shastr...@gmail.com> wrote: > >> >>>>>> > >> >>>>>> You have given a structure which has two member, One which stores > >> >>>>>> the > >> >>>>>> time and other stores the function pointer Your function has to > >> >>>>>> call > >> >>>>>> the > >> >>>>>> function stored in the fuction poitner after the time given in > the > >> >>>>>> structure elapses. > >> >>>>>> Design that function? > >> >>>>>> > >> >>>>>> Approach: To design this function I would use a min Heap data > >> >>>>>> structure. Each node of a heap has > >> >>>>>> two parameters one is the running time and other > >> >>>>>> one > >> >>>>>> is the function pointer. > >> >>>>>> > >> >>>>>> // Initialise a function pointer > >> >>>>>> typedef void (*functionToBeCalled)(int arg1, int arg2); > >> >>>>>> > >> >>>>>> // Timer structure > >> >>>>>> typedef struct timer > >> >>>>>> { > >> >>>>>> float runingTime; // in terms of seconds > >> >>>>>> functionToBeCalled funcToBeCall; // function pointer > >> >>>>>> }TIMER; > >> >>>>>> > >> >>>>>> void initTimer() > >> >>>>>> { > >> >>>>>> Initialise few nodes with running time and its corresponding > >> >>>>>> function > >> >>>>>> Initialise a MIN heap data structure > >> >>>>>> } > >> >>>>>> > >> >>>>>> void addTimer(uint32 runingTime, functionToBeCalled func) > >> >>>>>> { > >> >>>>>> TIMER *temp; > >> >>>>>> temp = (TIMER *)malloc(sizeof(TIMER)); > >> >>>>>> temp->runingTime = runningTime > >> >>>>>> temp->funcToBeCall = func; > >> >>>>>> HeapAdd(temp); > >> >>>>>> Heapify(); > >> >>>>>> } > >> >>>>>> > >> >>>>>> void scheduler() > >> >>>>>> { > >> >>>>>> uint32 currentTime = ObtainCurrentTime(); > >> >>>>>> // Obtain the runing time of top most element of the > >> >>>>>> min > >> >>>>>> Heap > >> >>>>>> uint32 runingTime = PeakHeap(); > >> >>>>>> // if the runningTime is equal to current time then > >> >>>>>> extract the top most > >> >>>>>> // element of the heap and execute the function > >> >>>>>> associate > >> >>>>>> with it > >> >>>>>> // Heapify the MIN heap data structure > >> >>>>>> // Obtain the runing time of top most element of the > >> >>>>>> min > >> >>>>>> heap > >> >>>>>> // scheduler sleep for that much amount of time. > >> >>>>>> if(runingTime == currentTime) > >> >>>>>> { > >> >>>>>> TIMER * node = ExtractMinHeap(); > >> >>>>>> CreateThread(node->func, Thread); > >> >>>>>> Heapify(); > >> >>>>>> runingTime = PeakHeap(); > >> >>>>>> sleep(runningTime); > >> >>>>>> } > >> >>>>>> else > >> >>>>>> { > >> >>>>>> // scheduler updates its sleep time > >> >>>>>> // if runing time is not equal to current time > >> >>>>>> sleep(runningTime); > >> >>>>>> } > >> >>>>>> > >> >>>>>> } > >> >>>>>> > >> >>>>>> Let me know your comments > >> >>>>>> > >> >>>>>> -- > >> >>>>>> You received this message because you are subscribed to the > Google > >> >>>>>> Groups "Algorithm Geeks" group. > >> >>>>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>>>> To unsubscribe from this group, send email to > >> >>>>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>>>> For more options, visit this group at > >> >>>>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>>>> > >> >>>>> > >> >>>>> > >> >>>>> -- > >> >>>>> ........................ > >> >>>>> MOHIT VERMA > >> >>>>> > >> >>>>> -- > >> >>>>> You received this message because you are subscribed to the Google > >> >>>>> Groups "Algorithm Geeks" group. > >> >>>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>>> To unsubscribe from this group, send email to > >> >>>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>>> For more options, visit this group at > >> >>>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>>> > >> >>>> -- > >> >>>> You received this message because you are subscribed to the Google > >> >>>> Groups "Algorithm Geeks" group. > >> >>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>> To unsubscribe from this group, send email to > >> >>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>> For more options, visit this group at > >> >>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>> > >> >>> > >> >>> > >> >>> -- > >> >>> ........................ > >> >>> MOHIT VERMA > >> >>> > >> >>> -- > >> >>> You received this message because you are subscribed to the Google > >> >>> Groups > >> >>> "Algorithm Geeks" group. > >> >>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>> To unsubscribe from this group, send email to > >> >>> algogeeks+unsubscr...@googlegroups.com. > >> >>> For more options, visit this group at > >> >>> http://groups.google.com/group/algogeeks?hl=en. > >> >> > >> > > >> > -- > >> > You received this message because you are subscribed to the Google > >> > Groups > >> > "Algorithm Geeks" group. > >> > To post to this group, send email to algogeeks@googlegroups.com. > >> > To unsubscribe from this group, send email to > >> > algogeeks+unsubscr...@googlegroups.com. > >> > For more options, visit this group at > >> > http://groups.google.com/group/algogeeks?hl=en. > >> > > >> > >> > >> > >> -- > >> Gaurav Menghani > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups > >> "Algorithm Geeks" group. > >> To post to this group, send email to algogeeks@googlegroups.com. > >> To unsubscribe from this group, send email to > >> algogeeks+unsubscr...@googlegroups.com. > >> For more options, visit this group at > >> http://groups.google.com/group/algogeeks?hl=en. > >> > > > > -- > > You received this message because you are subscribed to the Google Groups > > "Algorithm Geeks" group. > > To post to this group, send email to algogeeks@googlegroups.com. > > To unsubscribe from this group, send email to > > algogeeks+unsubscr...@googlegroups.com. > > For more options, visit this group at > > http://groups.google.com/group/algogeeks?hl=en. > > > > > > -- > Gaurav Menghani > > -- > You received this message because you are subscribed to the Google Groups > "Algorithm Geeks" group. > To post to this group, send email to algogeeks@googlegroups.com. > To unsubscribe from this group, send email to > algogeeks+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/algogeeks?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algogeeks@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.