倪勋的专栏

智慧和勇气,人生的两个财富

用户操作
[即时聊天] [发私信] [加为好友]
倪勋ID:nixun
17020次访问,排名7320(-1),好友0人,关注者0人。
nixun的文章
原创 13 篇
翻译 0 篇
转载 6 篇
评论 6 篇
nixun的公告
最近评论
crunch:Sorry, ExMinimumLookasideDepth 确实为4
crunch:但这个深度从不低于4,这也是新链表的初始深度。
这个说法在Win2003的源代码中看到的不一致.
Lookaside->L.Depth = ExMinimumLookasideDepth;
Lookaside->L.MaximumDepth = 256; //Depth;

DriverUnload只是在DriverEntry返回……
woaipinkfloyd:怎么没有提供答案
想学习学习
maleo:不错的说!!!!
最快的排序?
好像有o(n)的吧
radix sort
siso:请问目前哪种排序速度最快,是否快速排序?
文章分类
收藏
    相册
    个人blog链接
    Jerry
    johnny
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Google 面试题讨论收藏

    新一篇: 好久没更新了。。。。。。 | 旧一篇: 凹凸电子Firmware/Software Engineer笔试题目(俺的处女笔试,赫赫)

    csdn.net

    题目:对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。

    分析:要使pop,push,min都是O(1),所以肯定要牺牲点空间

    思路:1:在stack的数据结构中加一个字段,如

         typedef struct {

               int data[MAX];

               int top;

               int min;

         }stack;

              pop,push的时候都去栈顶元素,所以是O(1)

              min的时候取stack的min字段,所以也是O(1)

             每次push的时候进行比较,如果当前push的元素比stack->min小,则用当前元素替换stack->min。于是达到了取min的效果,程序如下

              int push(stack * s,int x){

                     ASSERT(s!=NULL);

                     if(s->top>=MAX) 

                     {

                            printf("Stack overload!");

                            return -1;

                     }

                     s->data[s->top++]=x;

                     if(x<s->min)

                      s->min=x;

                     return 0;

            }

            int pop(stack *s,int *x)

            {

                   ASSERT(s!=NULL);

                  if(s->top<=0)

                  {

                          printf("Stack Empty!");

                          return -1;

                 }

                (*x)=s->data[s->top--];

               return 0;

    }

    int min( stack *s,int *x )

    {

          ASSERT(s!=NULL);

          (*x)=s->min;

         return 0;

    }

    注:这种情况下如果pop的数正好是min的话,这种情况是无法正确设置min的,所以这种方法行不通。

    思路2:设置辅助栈ass,记录每个状态下的最小值,每次插入时,得到辅助栈当前值,和插入的值比较

    如果小则插入到最小值栈的就是它,否则就是原来的最小值,通过这种方式,pop,push,min三个都是

    O(1)算法的。

    typedef struct {

         int data[MAX];

         int top;

    }stack;

    STATIC int push_stack(stack *s,int x)

    {

          ASSERT((s!=NULL));

          if(s->top>=MAX)

          {

                printf("Stack overload");

                return -1;

          }

         s->data[s->top++]=x;

         return 0;

    }

    STATIC int pop_stack(stack *s,int *x)

    {

          ASSERT(s!=NULL);

          if(s->top<=0)

          {

                  printf("Stack Empty");

                  return -1;

           }

           (*x)=s->data[s->top--];

           return 0;

    }

    int push(stack *main,stack *ass,int x)

    {

           ASSERT((main!=NULL)&&(ass!=NULL));

           int temp;

           pop_stack(ass,&temp);

           push_stack(main,x);

           if(x<temp)

           {

                   push_stack(ass,temp);

                   push_stack(ass,x);

           }

           else

           {

                    push_stack(ass,temp);

                    push_stack(ass,temp);

           }

           return 0;

    }

    int pop(stack *main,stack *ass,int *x)

    {

            ASSERT((main!=NULL)&&(ass!=NULL));

           int temp;

           pop_stack(ass,&temp); 

           pop_stack(main,x);

           return 0;

    }

    int min(stack *ass,int *x)

    {

           ASSERT((main!=NULL)&&(ass!=NULL));

           pop_stack(ass,x);

           push_stack(ass,(*x));

           return 0;
    }

    发表于 @ 2006年01月11日 19:03:00|评论(loading...)|编辑

    新一篇: 好久没更新了。。。。。。 | 旧一篇: 凹凸电子Firmware/Software Engineer笔试题目(俺的处女笔试,赫赫)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © nixun