寻找未存在的最小数

       端午节帮同学做一个关于数据库的毕设,这其中有一个问题值得总结。

      问题描述:我们要向数据库中写有几个字段的记录。 其中第一个字段和第二个字段之间的关系是1:n 。 比如:第一个字段值为A,则其对应的第二个字段值为 1,2,3。。。   这就对应着数据库中的3条记录。  所以:我们无法用第一个字段来做主关键字。 而且其各个字段中也没有哪个字段的值是各不相同的,所以无法从这各个字段中寻找一个来作为关键字。(关键字段的值不可相同)。

      所以:我们需要给它添加一个关键字段,同时要保证该字段在每条记录中的值都不相同。我用的是用一个int来做关键字段。 从0往后递增。那由于各个记录中间要做多次添加,删除操作,而且添加时不是总添加到数据库的最后,有可能是insert中间(亦即:数据库中该关键字段的值不是从小到大排列的,而是乱序)。这最终导致再添加时:不知道该赋予这条新纪录什么关键字值!!

     刚开始的时候:我是想先遍历一遍,找出关键字值中的最大值max,而后赋新纪录的关键字值为max+1。  这样做没问题,但是如果记录很多,这导致该值会非常大!有可能超出其定义范围!最简单的办法就是:从一个int数组中找出未使用的,最小的值来作为新纪录的关键字值!

     那把问题简化一下就是:

        在一个乱序的int数组中:寻找未存在的,最小的数!

        比如:{1,9,2,3,6} 这其中最小的,未存在的数据是4.

 

     想了很多办法,发现也没什么特别好的解法,只能是:先排序,而后从低到高去寻找(寻找的依据是:如果当前值str[i] - str[i-1] > 1 那么我们要求的数就是 str[i-1] + 1)

 

      那可以直接先快排,而后再寻找。

     当然:也可以先堆排序,然后再在各个堆里来找,但是和上边效率差不多。 原本最初我还想过先冒泡,每次用最新冒出来的小数和其前的数进行比较,这种方法下:最好情况就是一次排序就搞定,0(n),要是最坏情况那就 n的平方了。   想了想:平均下来还是qs最好。

      如果有更好的方法,请告诉我。呵呵~

    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值