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 in range(j+1,N):for n in range(m+1,N):if Collinear(points[i],points[j],points[m]) & Collinear(points[j],points[m],points[n]):print('({},{}),({},{}),({},{}),({},{}) is collinear!'.format(x[i],y[i],x[j],y[j],x[m],y[m],x[n],y[n]))x_plot = [x[i],x[j],x[m],x[n]]y_plot = [y[i],y[j],y[m],y[n]]plt.plot(x_plot, y_plot,color = 'r')plt.scatter(x, y,color = 'b')# 排序法
## 计算两点连线的倾角
def angle(x,y):if (y[0] == x[0]) & (y[1] > x[1]):return math.pi/2if (y[0] == x[0]) & (y[1] < x[1]):return -math.pi/2if y[0] != x[0]:return math.atan((y[1]-x[1])/(y[0]-x[0]))
angles_set = set()def Fast():for i in range(N):angles = []index = []for j in range(N):if j != i:angles.append(angle(points[i], points[j]))index.append(j)data = np.array([angles,index]).Tsort_data = sorted(data,key=(lambda x:x[0]))for n in range(N-3):head = ntail = n+1while tail < N-1:while (tail < N-2) & (sort_data[head][0]==sort_data[tail][0]):tail = tail + 1if (tail - head >= 3) & (sort_data[head][0] not in angles_set):angles_set.add(sort_data[tail-1][0])index = np.array(sort_data)[head:tail,1]x_plot = []y_plot = []x_plot.append(x[i])y_plot.append(y[i])for k in index:x_plot.append(x[int(k)])y_plot.append(y[int(k)])point = np.array([x_plot,y_plot]).Tsort_point = sorted(point,key=(lambda x:x[0]))list_point = []for t in range(len(x_plot)):list_point.append('({},{})'.format(sort_point[t][0],sort_point[t][1]))print(' -> '.join(list_point))plt.plot(x_plot, y_plot,color = 'r')head = tailtail = tail+1plt.scatter(x, y,color = 'b')plt.title('The third Programming Assignment')if __name__ == '__main__':N = int(input('请输入点的个数: '))x = []y = []for i in range(N):x.append(float(input('请输入x坐标:')))y.append(float(input('请输入y坐标:')))points = np.array([x,y]).T

结果





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

  1. 普林斯顿算法课作业的python实现(四)8 Puzzle

    8 Puzzle 问题 思路 代码 结果 问题 这一次的编程作业是完成一个类似于"华容道"的游戏--8 puzzle: 给定一个 N×NN\times NN×N 的网格图,其中有一 ...

  2. 普林斯顿算法课作业 part II 的python实现(四)Boggle

    Boggle 问题 思路 代码 结果 总结 问题 原问题网页:Boggle 问题大致描述如下: 有一个 4×44\times44×4 的方格图,每一个格子上标有一个英文字母,现要从中寻找出英文单词. ...

  3. 「数据结构」普林斯顿算法课第二周作业

    「数据结构」普林斯顿算法课第二周作业 Algorithm I, Princeton 编程作业: Deques and Randomized Queues 思路 Deque.java Randomize ...

  4. 「数据结构」普林斯顿算法课第一周作业

    「数据结构」普林斯顿算法课第一周作业 Algorithm I, Princeton 编程作业: Percolation 思路 第一部分代码展示 第二部分代码展示 编程作业: Percolation P ...

  5. 普林斯顿算法课Part2第四周作业_Boggle

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/boggle.html 作业难点: 1.如何保证求解速度,满分要求是求解速度 >= ...

  6. python第三章实操作业

    python第三章实操作业 1.画出代码 a = [100,200,300]的内存存储示意图. 2.使用 range 生成序列:30,40,50,60,70,80 3.推导式生成列表: a = [x* ...

  7. Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)

    Python:三种方法计算最大公约数和最小公倍数 1.穷举法 2.欧几里德法 3.Stein算法 题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数: 参考资料:Python解决求最大 ...

  8. 寒假Python第三天作业

    寒假Python第三天作业作业 1:计算器: 请输入两个数和一个符号,完成两个数的+ - * / % // ** a=float (input ("请输入第一个数 : ")) b= ...

  9. Python第三课小节

    Python第三次课堂小结 1.列表元素操作 1.1列表元素的删除 2.列表元素访问与计数 3.浅拷贝/浅复制 4.列表排序 5.random函数产生随机数 6.用于序列操作的常用内置函数 1.列表元 ...

最新文章

  1. hiho一下第二周 Hihocoder #1014 : Trie树
  2. 自定义Chrome 滚动条样式
  3. ui unity 图片高亮_程序化生成UI模型与顶点动画
  4. Airflow 中文文档:集成
  5. Win10系列:C#应用控件进阶10
  6. 345. Reverse Vowels of a String【easy】
  7. 搭建代码审查系统Gerrit
  8. Java面向对象编程(第2版)pdf
  9. CSS字体设置中常用字体大全
  10. kali系统更新命令
  11. PADS 去除走线折角处提示和过孔提示
  12. 2021/4/27 “如何为div层添加边框?”(border属性详解)
  13. 奇趣携Red Bend推空中下载软件控件管理
  14. 6阶群的非平凡子群_子群和Lagrange定理
  15. 美团配送系统技术演进
  16. 中文标点符号unicode码
  17. grep命令 |grep
  18. 航嘉服务器维修电源,无故障60000小时,服务器/工控机电源推荐
  19. vi 全单词 (whole word) 搜素
  20. 《达·芬奇的广博与创新》notes

热门文章

  1. WORDLE猜词辅助器
  2. word2007中如何生成目录
  3. 《你不可不知的50个基因秘密》之同性恋取向
  4. 新零售社交电商系统开发社交新零售电商系统模式
  5. 联想Thinkpad E480笔记本电脑2分钟后自动黑屏解决办法
  6. mysql字段存数组
  7. java super.getclass_关于java中getClass()和getSuperClass()的讲解
  8. Java 设置Excel页面背景
  9. Logic Pro X 10.5.1 macOS 苹果音乐制作宿主软件下载
  10. win10分屏设置一边竖屏_win10怎么分屏2个?win10开启左右分屏方法