普林斯顿算法课作业的python实现(三)Collinear Points

本文介绍了普林斯顿算法课的一个编程作业——判断平面上的共线点。通过两种方法解析,包括暴力求解(O(N^4)时间复杂度)和优化策略,以一个点为原点计算倾角并排序,避免重复计算。提供了实现代码,并展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collinear Points

问题

这一次的编程作业是判断共线点。
问题大致描述如下:
给定平面上一些点,判断其中是否有四个及以上的点共线,把所有这些点找出来并连线。原题链接

思路

一种做法是暴力求解,遍历所有四个点,判断其是否共线。这种做法简单粗暴,但是时间复杂度在 O ( N 4 ) O(N^4) O(N4)
另一种做法是以其中一个点为坐标原点,计算其他点到该点的倾角,按倾角的大小对其他点排序,找出三个以上连续相同的点,与该点本身,构成共线。遍历所有的点,重复上述操作,可得到所有共线组。
这题的难点在于不重复。因为在计算的时候,很有可能会计算重复的共线组。我的策略是,以共线组的倾角为共线组的特征,建立一个倾角集合,将所有的共线组按倾角进行分类,倾角重复的视为一类,不再计算。

代码

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 19 18:54:15 2020

@author: zxw
"""

import matplotlib.pyplot as plt
import numpy as np
import math

# N=6
# x = [19000,18000,32000,21000,1234,14000]
# y = [10000,10000,10000,10000,5678,10000]
# N = 8
# x = [10000,0,3000,7000,20000,3000,14000,6000]
# y = [0,10000,7000,3000,21000,4000,15000,7000]

# 输入数据
# 暴力求解
## 判断三点共线
def Collinear(x,y,z):
    return (y[1]-x[1])*(z[0]-x[0]) == (y[0]-x[0])*(z[1]-x[1])

def Brute():
    for i in range(N):
        for j in range(i+1,N):
            for m 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值