C# 给定欧氏平面中的一组线可以形成的三角形的数量

news2025/1/21 18:05:47

         给定欧氏平面中的一组线可以形成的三角形的数量(Number of Triangles that can be formed given a set of lines in Euclidean Plane)

        给定欧氏平面上的 n 条不同直线的集合 L = {l 1 , l 2 , ………, l n }。第i 条直线由形式为 a i x + b i y = c i的方程给出。求出可以使用集合 L 中的直线形成的三角形的数量。请注意,没有两对直线会在同一点相交。 
注意:此问题未提及直线不能平行,这使得问题难以解决。

例子: 

输入:a[] = {1, 2, 3, 4} 
       b[] = {2, 4, 5, 5} 
       c[] = {5, 7, 8, 6}
       
输出:2

可以形成的三角形数量为:2

输入:a[] = {1, 2, 3, 2, 4, 1, 2, 3, 4, 5} 
       b[] = {2, 4, 6, 3, 6, 5, 10, 15, 20, 25} 
       c[] = {3, 5, 11, 10, 9, 17, 13, 11, 7, 3}
       
输出:30

可以形成的三角形数量为:30

朴素算法

朴素算法可以描述为: 

    1、从集合 L 中选取 3 条任意线。

    2、现在检查是否可以使用选定的 3 条线形成三角形。这可以通过检查它们是否都是平行线来轻松完成。

    3、如果可以形成三角形,则增加计数器。 
 
时间复杂度:有n C 3 (如图:)个三元组线。对于每个三元组,我们必须进行 3 次比较才能检查任何 2 条线是否不平行,这意味着检查可以在 O(1) 时间内完成。这使得朴素算法成为 O(n 3 ),如图: 

高效算法

这也可以在 O(n log n) 中实现。高效算法背后的逻辑如下所述。

我们将集合 L 划分为各种子集。子集的形成基于斜率,即特定子集中的所有线具有相同的斜率,即它们彼此平行。

让我们考虑三个集合(例如 A、B 和 C)。对于特定集合(例如 A),属于该集合的线都是彼此平行的。如果我们有 A、B 和 C,我们可以从每个集合中挑选一条线来得到一个三角形,因为这些线都不会平行。通过制作子集,我们确保没有两条平行的线被一起挑选。

现在如果我们只有这3 个子集, 

三角形的数量 =(从 A 中选取一条线的方式数量)* 
                      (从 B 中选取一条线的方式数量)* 
                      (从 C 中选取一条线的方式数量)
                   = m1*m2*m3

这里 m1 是具有第一个斜率的元素的数量(在集合 A 中)
这里 m2 是具有第一个斜率的元素的数量(在集合 B 中)
这里 m3 是具有第一个斜率的元素的数量(在集合 C 中)

类似地,如果我们有4 个子集,我们可以扩展这个逻辑来得到, 
三角形数量 = m1*m2*m3 + m1*m2*m4 + m1*m3*m4 + m2*m3*m4

对于大于 3 的子集数量,如果我们有“k”个子集,我们的任务是找到每次取 3 个子集元素数量的总和。这可以通过维护一个计数数组来完成。我们创建一个计数数组,其中计数i表示第i 个平行线子集的数量。 

我们逐一计算以下值。

sum1 = m1 + m2 + m3 ..... 
sum2 = m1*m2 + m1*m3 + ... + m2*m3 + m2*m4 + ... 
sum3 = m1*m2*m3 + m1*m2*m4 + ...... m2*m3*m4 + .... 
sum3 给出我们的最终答案

示例代码: 

// C# program to find the number of 
// triangles that can be formed 
// using a set of lines in Euclidean 
// Plane 
using System.Collections.Generic; 
using System;  
 
class GFG{
     
static double EPSILON = 1.0842e-19;
 
// Double variables can't be checked precisely 
// using '==' this function returns true if 
// the double variables are equal 
static bool compareDoubles(double A, double B) 

    double diff = A - B; 
    return (diff < EPSILON) && 
          (-diff < EPSILON); 

 
// This function returns the number of 
// triangles for a given set of lines 
static int numberOfTringles(int []a, int []b, 
                            int []c, int n) 

     
    // Slope array stores the slope of lines 
    List<double> slope = new List<double>();
    for(int i = 0; i < n; i++) 
        slope.Add((double)(a[i] * 1.0) / b[i]); 
 
    // Slope array is sorted so that all lines 
    // with same slope come together 
    slope.Sort(); 
 
    // After sorting slopes, count different 
    // slopes. k is index in count[]. 
    int []count = new int [n];
    int k = 0; 
     
    // Count of current slope 
    int this_count = 1; 
     
    for(int i = 1; i < n; i++) 
    { 
        if (compareDoubles((double)slope[i],
                           (double)slope[i - 1])) 
            this_count++; 
        else
        { 
            count[k++] = this_count; 
            this_count = 1; 
        } 
    } 
    count[k++] = this_count; 
 
    // Calculating sum1 (Sum of all slopes) 
    // sum1 = m1 + m2 + ... 
    int sum1 = 0; 
    for(int i = 0; i < k; i++) 
        sum1 += count[i]; 
 
    // Calculating sum2. sum2 = m1*m2 + m2*m3 + ... 
    int sum2 = 0; 
     
    // Needed for sum3 
    int []temp = new int [n]; 
    for(int i = 0; i < k; i++) 
    { 
        temp[i] = count[i] * (sum1 - count[i]); 
        sum2 += temp[i]; 
    } 
    sum2 /= 2; 
 
    // Calculating sum3 which gives
    // the final answer 
    // m1 * m2 * m3 + m2 * m3 * m4 + ... 
    int sum3 = 0; 
     
    for(int i = 0; i < k; i++) 
        sum3 += count[i] * (sum2 - temp[i]);
         
    sum3 /= 3; 
 
    return sum3; 

 
// Driver code 
public static void Main() 

     
    // lines are stored as arrays of a, b 
    // and c for 'ax+by=c' 
    int []a = { 1, 2, 3, 4 }; 
    int []b = { 2, 4, 5, 5 }; 
    int []c = { 5, 7, 8, 6 }; 
 
    // n is the number of lines 
    int n = a.Length;
 
     Console.WriteLine("The number of triangles " +
                       "that can be formed are: " + 
                       numberOfTringles(a, b, c, n));

}
 
// This code is contributed by Stream_Cipher 

输出: 

可形成的三角形数量为:2

时间复杂度:代码中的所有循环都是 O(n)。因此,此实现中的时间复杂度由用于对斜率数组进行排序的排序函数决定。这使得算法为 O(nlogn)。

辅助空间:O(n)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KubeKey安装K8s和kubesphere

安装指南 在 Linux 上安装 Kubernetes 和 KubeSphere 卸载 Kubernetes 和 KubeSphere 前置工作-网络问题 yum -y install socat conntrack etables ipsetalias kkkubectl -n kubesphere-systemexport http_proxy10.10.x.x:7890 export https_proxy10.10.x.x:7890Docker设置网…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…

聊一聊 vPC Peer-gateway 网关增强功能

默认情况下 vPC 对等设备收到目的 MAC 地址为交换机上配置的 HSRP/VRRP 的虚拟 MAC 的数据报文,该交换机将根据其本地路由表对数据包进行路由并会用新的源目 MAC

基于深度学习的微出血自动检测及解剖尺度定位|文献速递-视觉大模型医疗图像应用

Title 题目 Toward automated detection of microbleeds with anatomical scale localization using deep learning 基于深度学习的微出血自动检测及解剖尺度定位 01 文献速递介绍 基于深度学习的脑微出血&#xff08;CMBs&#xff09;检测与解剖定位 脑微出血&#xff…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…

Video-RAG:一种将视频RAG新框架

1. 摘要及主要贡献点 摘要&#xff1a; 检索增强生成&#xff08;RAG&#xff09;是一种强大的策略&#xff0c;通过检索与查询相关的外部知识并将其整合到生成过程中&#xff0c;以解决基础模型生成事实性错误输出的问题。然而&#xff0c;现有的RAG方法主要集中于文本信息&…

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙&#xff0c;不知不觉又是一年&#xff0c;这一年收获满满。接下来&#xff0c;将本年度对技术的感悟和洞察分析如下&#xff0c;希望对大家有所帮助。 在过去几十年里&#xff0c;嵌入式系统技术迅速发展&#xff0c;成为现代电子设备和智能硬件的核心组成部分。…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板&#xff0c;学会了后感觉虽然简单&#xff0c;但开始也折腾了好久&#xff0c;这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”&#xff0c;这里命…

欧拉(Euler 22.03)安装ProxySQL

下载离线安装包 proxysql-2.0.8-1-centos7.x86_64.rpm 链接: https://pan.baidu.com/s/1R-SJiVUEu24oNnPFlm9wRw 提取码: sa2w离线安装proxysql yum localinstall -y proxysql-2.0.8-1-centos7.x86_64.rpm 启动proxysql并检查状态 systemctl start proxysql 启动proxysql syste…

Comsol 空气耦和超声表面波法检测PMMA表面裂纹

空气耦合超声表面波法是一种常用于检测材料表面裂纹的无损检测技术。下面是一些步骤&#xff0c;您可以使用这种方法来检测PMMA&#xff08;聚甲基丙烯酸甲酯&#xff09;表面裂纹&#xff1a; 1. 准备工作&#xff1a;准备一台超声波检测设备&#xff0c;包括超声发射器和接收…

Unsafe

1. 概念介绍 sun.misc.Unsafe 是 Java 中的一个特殊类&#xff0c;它提供了一组低级别的、不安全的操作&#xff0c;这些操作通常是 JVM 内部使用的。由于这些操作非常强大且危险&#xff0c;因此 Unsafe 类被设计为只能在受信任的代码中使用。 2. 主要功能和用途 内存操作&a…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…

Linux初识:【版本控制器Git】【调试器gdb/cgdb使用】

目录 一.版本控制器Git 1.1版本控制器 1.2Git的操作 1.2.1从远端仓库到本地 1.2.2工作区到本地暂存区 1.2.3本地暂存区到本地仓库 1.2.4本地仓库到远程仓库 1.2.5 .gitignore 1.2.6Windows上操作&#xff08;需要安装Tortoisegit&#xff09; 1.2.7同步远端和当地 二调…

【MATLAB源码-第259期】基于matlab的64QAM调制解调锁相环环载波同步仿真,对比前后星座图,输出锁相环响应曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 概述 在现代数字通信系统中&#xff0c;为了提高频谱利用率和数据传输效率&#xff0c;经常采用多阶调制技术。64QAM&#xff08;64阶正交幅度调制&#xff09;便是其中的一种&#xff0c;它通过将数据映射到64个不同的复…

BEVFusion论文阅读

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准&#xff0c;当前的方法依赖于激光雷达传感器的点云作为查询&#xff0c;以利用图像空间的特征。然而&#xff0c;人们发现&#xff0c;这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…

大模型LLM-微调 RAG

RAG小结 这篇文章是一篇关于大型语言模型&#xff08;LLMs&#xff09;增强技术的综述论文&#xff0c;特别聚焦于检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;这一领域。详细考察了RAG的发展、技术基础、关键技术、评估框架以及未来的研究方向。…

TongESB7.1.0.0如何使用dockercompose运行镜像(by lqw)

文章目录 安装准备安装 安装准备 1.安装好docker和dockercompose&#xff1a; docker、docker-compose安装教程&#xff0c;很详细 2.上传好安装相关文件 安装 使用以下命令导入管理端镜像和运行时镜像 docker load -i tongesb_manage_7100.tar docker load -i tongesb_se…

Acwing-基础算法课笔记之基础算法(二分)

Acwing-基础算法课笔记之基础算法&#xff08;二分&#xff09; 一、二分查找的概念1、使用二分的条件2、二分查找的算法流程 二、左闭右闭写法[left,right]三、左闭右开写法[left,right)四、浮点数的二分 一、二分查找的概念 1、使用二分的条件 1、必须是数组&#xff08;顺…

PHP教育系统小程序

&#x1f310; 教育系统&#xff1a;全方位学习新体验&#xff0c;引领未来教育风尚 &#x1f680; 教育系统&#xff1a;创新平台&#xff0c;智慧启航 &#x1f4f1; 教育系统&#xff0c;一款深度融合科技与教育的创新平台&#xff0c;匠心独运地采用先进的ThinkPHP框架与U…