被优化后,可以禁止公司继续使用我写的工具吗?
可谁能想到,一年不到,自己就被优化了。那么,问题来了,既然公司在用了我写的工具之后,给我踢出了局,那我是不是可以要求公司停止使用它呢?
首先,工具一旦交给公司使用,特别是作为开源项目,版权和使用权通常会在协议里有规定。
如果你在入职前就明确将这个工具作为开源项目发布,那么公司在合规使用的情况下,是没有理由停止使用它的,哪怕你被优化了。毕竟,工具的使用不依赖于某一个人,而是基于它的功能和对团队的价值。
不过,如果你明确规定了某些使用限制,或者在工具的许可协议里有所说明,那么就可以尝试和公司协商,看能不能达成一个停止使用的共识。
但如果你啥也没写,那就有点吃亏了😂。毕竟,公司有权利继续使用它,除非你能提供某种法律依据来证明他们不得继续使用。【备注:文末可领最新资料】。
算法题:二指输入的的最小距离
今天我碰到一个挺有意思的题目:二指输入的最小距离
首先,这个题目背景是这样的:假设你有两个手指,每次你在一个二维的平面上输入一个点,问题的目标就是计算这两个点之间的最小距离。可能有人会想,哎呀,这不就是简单的两点距离公式吗?对的,按照平面上两点的欧几里得距离公式,咱们的计算确实是有个标准公式:
看起来很简单吧?那如果只是两个点间的计算,那确实没什么难度。但如果是多个点,甚至是动态的输入,我们就得考虑一些优化的策略了。别着急,先继续往下看。
首先要明确的是:最小距离问题,按常规的思路就是求解任意两个点之间的最小值。假设我们有一组点坐标,问题的核心是要通过这些点计算出距离最小的两个点。那么,最直接的暴力法就是拿每一个点和其他点比较一遍。这样时间复杂度就是O(n^2),如果n比较大,计算量就爆炸了。
这时,你就会发现暴力法的问题:如果有很多点,计算的时间就会变得非常长,明显不太适用。所以,我们就需要优化。幸运的是,计算几何中有一个非常经典的算法——分治法。通过分治法,我们能够将问题分解成较小的子问题来求解,时间复杂度也能降到O(n log n)。
让我们来看看如何实现这个优化的分治法:
import java.awt.Point;
import java.util.Arrays;public class MinDistance {
// 计算两点间的欧几里得距离
public static double distance(Point p1, Point p2) {
return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
}
// 分治算法的核心
public static double closestPair(Point[] points) {
// 排序:首先按x坐标排序
Arrays.sort(points, (p1, p2) -> p1.x - p2.x);
return closestPairRecursive(points, 0, points.length - 1);
}
// 递归求解最小距离
private static double closestPairRecursive(Point[] points, int left, int right) {
if (right - left <= 3) {
return bruteForce(points, left, right);
}
int mid = (left + right) / 2;
Point midPoint = points[mid];
double leftDist = closestPairRecursive(points, left, mid);
double rightDist = closestPairRecursive(points, mid + 1, right);
double minDist = Math.min(leftDist, rightDist);
return minDist;
}
// 使用暴力法计算最小距离
private static double bruteForce(Point[] points, int left, int right) {
double minDist = Double.MAX_VALUE;
for (int i = left; i <= right; i++) {
for (int j = i + 1; j <= right; j++) {
minDist = Math.min(minDist, distance(points[i], points[j]));
}
}
return minDist;
}
public static void main(String[] args) {
Point[] points = {
new Point(0, 0),
new Point(2, 2),
new Point(3, 3),
new Point(5, 5)
};
System.out.println("最小距离:" + closestPair(points));
}
}
这个代码做了什么呢?首先,它对所有点按x坐标进行了排序。接着,它利用递归分治的思想,解决了大问题的小问题。它首先将所有点分成两部分,然后分别计算每部分内的最小距离,再通过合并的方式计算最终结果。这里,我们在递归过程中使用暴力法来计算每一部分的最小距离,确保算法的正确性。
但问题还没有结束!最难的部分其实是在合并阶段。为什么呢?因为,当我们分成两部分后,中间的点也可能有最小距离,这就需要额外的处理。算法的思想是:对于中间的点,我们只需要比较那些距离中轴线(即分治的中间线)比较近的点。这是分治法中的一个精妙的地方,可以大大减少不必要的计算。
当然,代码里的优化并不是完美的,特别是在bruteForce部分,仍然是O(n^2),但通过递归的方式将问题大大简化,提升了整体的计算效率。
实际应用中,如果点的数量非常大,那么优化后的算法就能发挥出它的优势,毕竟O(n log n)的时间复杂度已经远远优于O(n^2)。而解了。
希望你们能从这个例子中得到一些启发,别怕复杂的问题,技术上总有办法解决!
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
同时,也欢迎加入下方的交流群,一起研究deepseek的最新玩法