程序员老鬼

被优化后,可以禁止公司继续使用我写的工具吗?

说实话,这个问题让我想起了我当年刚入职时做的一个开源工具,那时候写得非常开心,觉得能帮大家提高工作效率,简直是牛气冲天。

可谁能想到,一年不到,自己就被优化了。那么,问题来了,既然公司在用了我写的工具之后,给我踢出了局,那我是不是可以要求公司停止使用它呢?

Image

首先,工具一旦交给公司使用,特别是作为开源项目,版权和使用权通常会在协议里有规定。

如果你在入职前就明确将这个工具作为开源项目发布,那么公司在合规使用的情况下,是没有理由停止使用它的,哪怕你被优化了。毕竟,工具的使用不依赖于某一个人,而是基于它的功能和对团队的价值。

不过,如果你明确规定了某些使用限制,或者在工具的许可协议里有所说明,那么就可以尝试和公司协商,看能不能达成一个停止使用的共识。

但如果你啥也没写,那就有点吃亏了😂。毕竟,公司有权利继续使用它,除非你能提供某种法律依据来证明他们不得继续使用。【备注:文末可领最新资料】。

算法题:二指输入的的最小距离

今天我碰到一个挺有意思的题目:二指输入的最小距离

首先,这个题目背景是这样的:假设你有两个手指,每次你在一个二维的平面上输入一个点,问题的目标就是计算这两个点之间的最小距离。可能有人会想,哎呀,这不就是简单的两点距离公式吗?对的,按照平面上两点的欧几里得距离公式,咱们的计算确实是有个标准公式:

Image

看起来很简单吧?那如果只是两个点间的计算,那确实没什么难度。但如果是多个点,甚至是动态的输入,我们就得考虑一些优化的策略了。别着急,先继续往下看。

首先要明确的是:最小距离问题,按常规的思路就是求解任意两个点之间的最小值。假设我们有一组点坐标,问题的核心是要通过这些点计算出距离最小的两个点。那么,最直接的暴力法就是拿每一个点和其他点比较一遍。这样时间复杂度就是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的最新玩法

图片