端午节帮同学做一个关于数据库的毕设,这其中有一个问题值得总结。
问题描述:我们要向数据库中写有几个字段的记录。 其中第一个字段和第二个字段之间的关系是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最好。
如果有更好的方法,请告诉我。呵呵~