我有以下排序的python列表,尽管可能出现多个值:
[0.0943200769115388, 0.17380131294164516, 0.4063245853719435,
0.45796523225774904, 0.5040225609708342, 0.5229351852840304,
0.6145136350368882, 0.6220712583558284, 0.7190096076050408,
0.8486436998476048, 0.8957381707345986, 0.9774325873910711,
0.9832076130275351, 0.985386554764682, 1.0]
现在,我想知道数组中特定值可能下降的索引:
例如,值0.25将落在索引2
中,因为它介于0.173和0.40之间。我想我可以浏览列表并在for循环中执行此操作,但我想知道是否有更好的方法来执行此操作,这可能更具计算效率。我创建了一次这个数组,但必须执行很多查找。
答案 0 :(得分:2)
>>> vals = [0.0943200769115388, 0.17380131294164516, 0.4063245853719435,
0.45796523225774904, 0.5040225609708342, 0.5229351852840304,
0.6145136350368882, 0.6220712583558284, 0.7190096076050408,
0.8486436998476048, 0.8957381707345986, 0.9774325873910711,
0.9832076130275351, 0.985386554764682, 1.0]
>>> import bisect
>>> bisect.bisect(vals, 0.25)
2
答案 1 :(得分:1)
如果您知道列表已经排序,则教科书解决方案是进行二进制搜索。保留两个索引边界,min和max。将它们初始化为0和len - 1.然后将mid设置为(min + max)/ 2.将index mid的值与目标值进行比较。如果它更小,则将min设置为mid + 1.如果它更大,则将max设置为mid - 1.重复直到找到该值或直到max< min,在这种情况下,您将在O(log(n))步骤中找到所需的索引。