最有效的方法来查找列表中最近的数字

时间:2015-05-21 20:48:00

标签: java

我知道他们说什么预优化是所有邪恶的根源但是我更好奇这里最有效的方法是什么。知道更多的知识库,你知道吗?

基本上我有一个整数集合,如下所示:

for

现在我想找到最接近的数字,向下舍入。例如,我的数字为192.因此,此列表中返回的值将为" 57"。如果数字是58,则同样适用。它只是找到下一个最低的数字。

目前我从头开始循环遍历列表,使用var express = require('express'); var app = express(); var mongojs = require('mongojs'); var db = mongojs('posts', ['posts']); var bobyParser = require('body-parser'); app.use(express.static(__dirname + "/public")); app.use(bobyParser.json());// app.get('/posts', function (req, res) { console.log("I got the server request!") db.posts.find(function (err, docs) { console.log(docs); res.json(docs); }); }); app.post('/posts', function (req, res) { console.log(req.body); //Insert - This is the first part of the CRUD db.posts.insert(req.body, function (err, doc) { res.json(doc); }); }); app.delete('/posts/:id', function (req, res) { var id = req.params.id; console.log(id); db.posts.remove({ _id: mongojs.ObjectId(id) }, function (err, doc) { res.json(doc); }); }); app.get('/posts/:id', function (req, res) { var id = req.params.id; console.log(id); db.posts.findOne({ _id: mongojs.ObjectId(id) }, function (err, doc) { res.json(doc); }); }); app.put('/posts/:id', function (req, res) { var id = req.params.id; console.log(req.body.name); db.posts.findAndModify({ query: { _id: mongojs.ObjectId(id) }, update: { $set: { name: req.body.name, info: req.body.info, twitter: req.body.twitter }}, new: true }, function (err, doc) { res.json(doc); }); }); app.listen(3000); console.log("Server running from port 3000"); 然后返回列表的索引,这将是我想要的数字。我很好奇是否有更有效的方法来做到这一点。

4 个答案:

答案 0 :(得分:4)

通用列表

如果对列表一无所知,迭代列表并记住当前最佳解决方案确实是最有效的解决方案。

如果您计划进行数千次此类查询,则可以先对列表进行排序。

排序列表

如果列表已排序,您可以使用binarySearch(List<? extends Comparable<? super T>> list, T key)方法。此方法返回新元素的插入点。如果元素存在,则返回该元素的正索引。否则返回插入索引的按位否定

然后你可以用:

来调用它
//only to be used if list is sorted (a priori)
public int closestValue (List<Integer> list, int value) {
    int index = Collections.binarySearch(list,value);
    if(index < 0) {
        index = ~index-1;
    }
    return list.get(index);
}

jdoodle demo

如果没有这样的元素,该方法将抛出IndexOutOfBoundsException

二进制搜索可以在 O(log n)中完成,但只能 - 如前所述 - 如果列表已排序。

答案 1 :(得分:2)

如果列表已排序,那么您可以在列表中进行二进制搜索,您可以在日志(n)中获取no。

答案 2 :(得分:1)

您可以对列表进行排序,然后使用二进制搜索方法查找最接近的数字。

答案 3 :(得分:-2)

创建一个大小为最大值的HashMap,然后用预期结果的密钥对填充地图。即map.put(6,5); map.put(7,5)等。

之后获得正确的值将在O(1)。

当然,地图的创建需要更多的时间和追索权,但在无限的时间内,这将产生最快的结果。