- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 VPC,假设它的 CIDR block 是 10.0.0.0/16。我在那个 VPC 中有几个随机子网。他们的 CIDR 可能类似于 10.0.128.0/19、10.0.32.0/19、10.0.208.0/22。子网的 CIDR block 必须被 VPC 的 CIDR block 覆盖。此外,不允许子网之间的 CIDR 重叠。
我的问题是:给定这样的 VPC 和子网,如何为我要创建的新子网(比方说/22)找到具有特定大小的好 CIDR block 。在我看来,好 意味着更好地利用空间。比方说,如果我只想要一个小的 CIDR block ,它不应该在 VPC CIDR 的中间返回一个 CIDR,这样可以防止将来放置潜在的大 CIDR block 。欢迎使用其他好的定义。没有任何初始状态的保证。
我不知道是否有针对此类问题的标准算法。我目前正在考虑的是利用二叉树。左 child 表示 0,而右 child 表示 1。所有叶子代表正在使用的 CIDR block 。要获得一个新的 CIDR block ,问题基本上是在某种程度上创建一个休假取决于所需的 block 大小。如何创造一个好的叶子我还不知道。
顺便说一句,我正在编写 Java 代码。我找不到这个图书馆。如果有现有的库,也请告诉我!
最佳答案
二叉树是正确的结构,但它不需要深入到叶级。仅在需要时将其取下。树中的每个叶子代表一个分配或一个可用 block 。根据定义,每个 CIDR block 的大小都是 2 的幂。因此,如果一个节点/ block 有子节点,则它正好有两个。如果节点有子节点(不是叶节点),则其 block 不可用。
因此,您的顶级 block 及其初始分配像这样分解(从左边缘表示的树以便于绘制。***
标记分配的 block 。[我可能很胖-在这里指指点点,但基本思想应该很清楚:每个/16 有两个/17 子节点,每个/17 有两个/18 子节点,等等。除非该节点可用,在这种情况下它没有子节点。]):
/---- 10.0.0.0/19
|
/--- 10.0.0.0/18
| |
| \---- 10.0.32.0/19***
|
/--- 10.0.0.0/17
| \
| ---- 10.0.64.0/18
|
10.0.0.0/16
|
| /---- 10.0.128.0/19***
| |
| /---- 10.0.128.0/18
| | |
| | \---- 10.0.160.0/19
| |
\--- 10.0.128.0/17
|
| /---- 10.0.192.0/20
| |
| /---- 10.0.192.0/19
| | |
| | | /---- 10.0.208.0/22***
| | | |
| | | /---- 10.0.208.0/21
| | | | |
| | | | \---- 10.0.212.0/22
| | | |
| | \---- 10.0.208.0/20
| | |
| | \---- 10.0.216.0/21
| |
\---- 10.0.192.0/18
|
\---- 10.0.224.0/19
因此,例如,要找到/24 的 block ,首先遍历树(以任何顺序)寻找大小恰好为/24 的 block 。如果你找到一个,你就完成了;将其标记为已分配并返回。在遍历过程中,跟踪您发现的小于/24 的最小块。。 (显然,如果您到达树中小于/24 的任何节点,则不需要进一步遍历其子树,因为大小只会从那里下降。)
如果您没有找到恰好是/24 的 block ,那么您将转到您保存的 block ,它是大小大于/24 的最小块。然后将该 block 切成两半,用两个半尺寸 block 替换它。捕获其中之一(任意)。如果它是/24 你就完成了。如果不是,则递归将该 block 一分为二,依此类推。最终,您会找到/24。
假设大于/24 的最小块是/21。通过以这种方式递归分割,您会将/21 分割成:两个/24(一个您已分配,一个仍然可用)、一个可用的/23 和一个可用的/22。
如果一个 block 被返回给你,你可以将它与它的伴随 block 组合起来,前提是该 block 可用(即一个叶子并且没有标记为已分配)。如果您可以将它与它的同伴结合起来,您也许也可以将它的 parent 与 parent 的双胞胎结合起来。
(顺便说一句,这与@mcdowella 的回答兼容;只是添加了细节。)
关于java - 使用什么算法从基本 CIDR 获取子 CIDR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104569/
如何将十进制数字转换为mixed radix表示法? 我猜想给定每个基数数组的输入和十进制数,它应该输出每列值的数组。 最佳答案 伪代码: bases = [24, 60, 60] input = 8
我有 Table-A,其中有“x”行。 (对于这个例子有 8 行) 我通过使用游标创建了列数为“x”的Table-C。 (使其动态化;如果将更多行添加到 Table-A,则会在 Table-C 中创建
我有一个关于对象的(很可能是简单而愚蠢的)问题。我创建了实例“Person”的对象“jon”。当我打电话时 console.log(jon.name) 控制台会给我输出“jon”。到目前为止,一切都很
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: javascript function vs. ( function() { … } ()); 抱歉,如果这太基础了
我正在尝试用 Java 重新创建射弹轨迹,但是,我遇到了一些问题。我看过很多解释公式之类的视频,但他们的方程中有一个目标,而我没有。我的意思是,他们有一个范围来计算子弹的下落,但我试图弄清楚子弹最终会
(希望如此)来自一个完整的 Rust 初学者的一个简单问题。我的循环有什么问题? num 计算结果为“69”的速度相当快,但是一旦 num 设置为“69”,循环就永远不会退出。我肯定遗漏了一些明显的东
我在 id="name"的元素上应用“.length”,但它计数为 29 而不是 14。我想知道我的错误在哪里?如果有人可以让我知道,那就太好了。谢谢! var name=document.getEl
我知道这很简单,但由于某种原因我无法让它工作。我正在尝试在 Java 中创建自定义颜色,但它似乎不起作用。 import java.awt.Color; Color deepGreen = new C
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
我想将以下实体映射转换为 Priority 对象。在 getter 上,当我将“Short”更改为“Priority”并遵循 this.priority 时,它会提示 'basic' 属性类型不应该是
我正在开发一个相当基本的函数,我发现很难弄清楚为什么我会得到我的输出。 def mystery(n): print(n) if n < 4: my
我正在尝试对 WordPress 安装的新闻部分实现同位素过滤。我是 JavaScript/jQuery 的新手,正在尝试随时随地学习。我首先使用 Filters section of the Iso
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我在另一个实体类中引用一个实体并收到此错误。下面是示例代码。我在 persistence.xml 中也有这些类。 是什么导致了这个问题?我正在使用 Spring 数据 JPA 和 Hibernate。
我正在解析 HTML 并重新格式化图像以使其更好地适应。由于某种原因,当我有多个图像需要解析时,我会超出范围,而且我一生都无法弄清楚为什么。 当 imgArray.count >1 时,我将使用带有递
我是 SQL 新手,正在尝试创建一个基本的子查询。我需要找出经理的平均年龄和实习生的平均年龄之间的差异。 标题为一栏 - 经理或实习生年龄是一列,全部在同一个表中。 我会使用两个子查询来做类似的事情:
我习惯了 csh,所以不得不使用 bash 有点烦人。这段代码有什么问题? if[$time > 0300] && [$time 和 300 && time < 900 )) then mod
我建立了这个页面:http://excelwrestling.com/poola.php即将到来的双重锦标赛。我的大部分数据都是从我的 mySQL 数据库中提取的,现在只有一些示例数据。 我希望链接选
是否有任何原因导致以下内容不起作用: for (i=0;i < someArray.length;i++) { if (someArray[i].indexOf("something") !=
我现在正在学习 Javascript,有一个问题一直困扰着我! 因此,我在这里所需要做的就是在此输入框中键入颜色,单击按钮并将标题更改为键入的颜色(仅当键入的颜色位于变量中指定的数组中时)。 我的代码
我是一名优秀的程序员,十分优秀!