C ++:维护有序ip地址表的最快方法是什么

时间:2016-06-10 06:23:04

标签: c++ algorithm dns

这是我遇到的问题:

  1. DNS查询以随机顺序生成ip地址列表。佛 例如,如果有4个地址,则查询2次导致4个地址 以不同的顺序出现。

  2. 现在要求设置一个可以访问O(1)中地址的有序表。

  3. 潜在的解决方案是每次都订购ip地址。所以对于ex,如果收到2,1,7,4,我们可以对它进行排序,结果总是1,2,4,7,并且通过将ip地址放在向量中,我们可以用O(1)<索引它/ p>

  4. 当DNS产生5地址时出现问题,让我们说新地址是3.现在3将被添加到表之间并且由于第3个元素应该是4,因此排序被搞砸了。我们需要添加表格末尾的新元素
  5. 删除元素也需要优雅处理,有一个空表槽可能会导致问题。
  6. 可以使用O(1)或最差O(logn)

    来完成

    问题是每次有序列表作为输入时都要保持IP地址的排序

1 个答案:

答案 0 :(得分:0)

这样的事情?

#include <unordered_map>
#include <array>
#include <algorithm>
#include <initializer_list>
#include <cassert>

struct ip_address
{
  ip_address(std::initializer_list<std::uint8_t> il)
  {
    auto max = std::min(il.size(),_ip4_data.size()); 
    assert(max == 4);
    std::copy_n(il.begin(), max, _ip4_data.begin());
  }
  auto& data() const { return _ip4_data; }
  auto& data() { return _ip4_data; }
  const uint8_t& operator[](std::size_t i) const {
    return _ip4_data[i];
  }
  std::array<std::uint8_t, 4> _ip4_data;
};

bool operator==(const ip_address& l, const ip_address& r)
{
  return l.data() == r.data();
}

namespace std
{
  template<> struct hash<ip_address> {
    std::size_t operator()(const ip_address& r) const
    {
      // reverse the byte order so that the lsb of the ip
      // has the greatest effect on the hash value
      return std::size_t((r[3] << 24) & 0xff000000 
                         + (r[2] << 16) & 0x00ff0000
                         + (r[1] << 8) & 0x0000ff00
                         + r[0] & 0x000000ff); 
    }
  };
}


using client_server_map = std::unordered_map<ip_address, ip_address>;

int main()
{
  client_server_map cs_map;

  cs_map.emplace(ip_address{10, 0, 0, 1}, ip_address{192, 168, 0, 1});
  cs_map.emplace(ip_address{10, 0, 0, 2}, ip_address{192, 168, 0, 2});
  cs_map.erase(ip_address{10, 0, 0, 1});
}