C#,数值计算——分类与推理Phylagglom的计算方法与源程序

news2024/11/18 16:47:07

1 文本格式

using System;
using System.Collections.Generic;

namespace Legalsoft.Truffer
{
    public abstract class Phylagglom
    {
        public int n { get; set; }
        public int root { get; set; }
        public int fsroot { get; set; }
        public double seqmax { get; set; }
        public double depmax { get; set; }
        public List<Phylagglomnode> t { get; set; } = new List<Phylagglomnode>();
        public abstract void premin(double[,] d, int[] nextp);
        public abstract double dminfn(double[,] d, int i, int j);
        public abstract double dbranchfn(double[,] d, int i, int j);
        public abstract double dnewfn(double[,] d, int k, int i, int j, int ni, int nj);
        public abstract void drootbranchfn(double[,] d, int i, int j, int ni, int nj, ref double bi, ref double bj);

        public Phylagglom(double[,] dist, int fsr = -1)
        {
            this.n = dist.GetLength(0);
            this.fsroot = fsr;
            this.t = new List<Phylagglomnode>(2 * n - 1);
        }

        public void makethetree(double[,] dist)
        {
            double[,] d = Globals.CopyFrom(dist);
            int[] tp = new int[n];
            int[] nextp = new int[n];
            int[] prevp = new int[n];
            int[] tasklist = new int[2 * n + 1];
            double[] tmp = new double[n];

            int j;
            int i = 0;
            for (; i < n; i++)
            {
                nextp[i] = i + 1;
                prevp[i] = i - 1;
                tp[i] = i;
                t[i].ldau = t[i].rdau = -1;
                t[i].nel = 1;
            }

            prevp[0] = nextp[n - 1] = -1;
            int ncurr = n;
            int imin = 0;
            int jmin = 0;
            int node = n;
            for (; node < 2 * n - 2; node++)
            {
                premin(d, nextp);
                double dmin = 9.99e99;
                for (i = 0; i >= 0; i = nextp[i])
                {
                    if (tp[i] == fsroot)
                    {
                        continue;
                    }
                    for (j = nextp[i]; j >= 0; j = nextp[j])
                    {
                        if (tp[j] == fsroot)
                        {
                            continue;
                        }
                        double dd = dminfn(d, i, j);
                        if ((dd) < dmin)
                        {
                            dmin = dd;
                            imin = i;
                            jmin = j;
                        }
                    }
                }

                i = imin;
                j = jmin;
                t[tp[i]].mo = t[tp[j]].mo = node;
                t[tp[i]].modist = dbranchfn(d, i, j);
                t[tp[j]].modist = dbranchfn(d, j, i);
                t[node].ldau = tp[i];
                t[node].rdau = tp[j];
                t[node].nel = t[tp[i]].nel + t[tp[j]].nel;
                for (int k = 0; k >= 0; k = nextp[k])
                {
                    tmp[k] = dnewfn(d, k, i, j, t[tp[i]].nel, t[tp[j]].nel);
                }
                for (int k = 0; k >= 0; k = nextp[k])
                {
                    d[i, k] = d[k, i] = tmp[k];
                }
                tp[i] = node;
                if (prevp[j] >= 0)
                {
                    nextp[prevp[j]] = nextp[j];
                }
                if (nextp[j] >= 0)
                {
                    prevp[nextp[j]] = prevp[j];
                }
                ncurr--;
            }

            i = 0;
            j = nextp[0];
            root = node;
            t[tp[i]].mo = t[tp[j]].mo = t[root].mo = root;

            //drootbranchfn(d, i, j, t[tp[i]].nel, t[tp[j]].nel, ref t[tp[i]].modist, ref t[tp[j]].modist);
            double tpim = t[tp[i]].modist;
            double tpjm = t[tp[j]].modist;
            drootbranchfn(d, i, j, t[tp[i]].nel, t[tp[j]].nel, ref tpim, ref tpjm);
            t[tp[i]].modist = tpim;
            t[tp[j]].modist = tpjm;

            t[root].ldau = tp[i];
            t[root].rdau = tp[j];
            t[root].modist = t[root].dep = 0.0;
            t[root].nel = t[tp[i]].nel + t[tp[j]].nel;
            int ntask = 0;
            seqmax = depmax = 0.0;
            tasklist[ntask++] = root;
            while (ntask > 0)
            {
                i = tasklist[--ntask];
                if (i >= 0)
                {
                    t[i].dep = t[t[i].mo].dep + t[i].modist;
                    if (t[i].dep > depmax)
                    {
                        depmax = t[i].dep;
                    }
                    if (t[i].ldau < 0)
                    {
                        t[i].seq = seqmax++;
                    }
                    else
                    {
                        tasklist[ntask++] = -i - 1;
                        tasklist[ntask++] = t[i].ldau;
                        tasklist[ntask++] = t[i].rdau;
                    }
                }
                else
                {
                    i = -i - 1;
                    t[i].seq = 0.5 * (t[t[i].ldau].seq + t[t[i].rdau].seq);
                }
            }
        }

        public int comancestor(int leafa, int leafb)
        {
            int i;
            int j;
            for (i = leafa; i != root; i = t[i].mo)
            {
                for (j = leafb; j != root; j = t[j].mo)
                {
                    if (i == j)
                    {
                        break;
                    }
                }
                if (i == j)
                {
                    break;
                }
            }
            return i;
        }

#if __UNUSED__
        private void newick(Phylagglom p, MatChar str, ref string filename)
        {
            FILE OUT = fopen(filename, "wb");
            int i;
            int s;
            int ntask = 0;
            int n = p.n;
            int root = p.root;
            int[] tasklist = new int[2 * n + 1];
            tasklist[ntask++] = (1 << 16) + root;
            while (ntask-- > 0)
            {
                s = tasklist[ntask] >> 16;
                i = tasklist[ntask] & 0xffff;
                if (s == 1 || s == 2)
                {
                    tasklist[ntask++] = ((s + 2) << 16) + p.t[i].mo;
                    if (p.t[i].ldau >= 0)
                    {
                        fprintf(OUT, "(");
                        tasklist[ntask++] = (2 << 16) + p.t[i].rdau;
                        tasklist[ntask++] = (1 << 16) + p.t[i].ldau;
                    }
                    else
                    {
                        fprintf(OUT, "%s:%f", str[i, 0], p.t[i].modist);
                    }
                }
                else if (s == 3)
                {
                    if (ntask > 0)
                    {
                        fprintf(OUT, ",\n");
                    }
                }
                else if (s == 4)
                {
                    if (i == root)
                    {
                        fprintf(OUT, ");\n");
                    }
                    else
                    {
                        fprintf(OUT, "):%f", p.t[i].modist);
                    }
                }
            }
            fclose(OUT);
        }

        private void phyl2ps(ref string filename, Phylagglom ph, MatChar str, int extend, double xl, double xr, double yt, double yb)
        {
            int i;
            int j;
            double id;
            double jd;
            double xi;
            double yi;
            double xj;
            double yj;
            double seqmax;
            double depmax;
            FILE OUT = fopen(filename, "wb");
            fprintf(OUT, "%%!PS\n/Courier findfont 8 scalefont setfont\n");
            seqmax = ph.seqmax;
            depmax = ph.depmax;
            for (i = 0; i < 2 * (ph.n) - 1; i++)
            {
                j = ph.t[i].mo;
                id = ph.t[i].dep;
                jd = ph.t[j].dep;
                xi = xl + (xr - xl) * id / depmax;
                yi = yt - (yt - yb) * (ph.t[i].seq + 0.5) / seqmax;
                xj = xl + (xr - xl) * jd / depmax;
                yj = yt - (yt - yb) * (ph.t[j].seq + 0.5) / seqmax;
                fprintf(OUT, "%f %f moveto %f %f lineto %f %f lineto 0 setgray stroke\n", xj, yj, xj, yi, xi, yi);
                if (extend != 0)
                {
                    if (i < ph.n)
                    {
                        fprintf(OUT, "%f %f moveto %f %f lineto 0.7 setgray stroke\n", xi, yi, xr, yi);
                        fprintf(OUT, "%f %f moveto (%s (%02d)) 0 setgray show\n", xr + 3.0, yi - 2.0, str[i, 0], i);
                    }
                }
                else
                {
                    if (i < ph.n)
                    {
                        fprintf(OUT, "%f %f moveto (%s (%02d)) 0 setgray show\n", xi + 3.0, yi - 2.0, str[i, 0], i);
                    }
                }
            }
            fprintf(OUT, "showpage\n\x0004");
            fclose(OUT);
        }
#endif
    }
}
 

2 代码格式

using System;
using System.Collections.Generic;

namespace Legalsoft.Truffer
{
    public abstract class Phylagglom
    {
        public int n { get; set; }
        public int root { get; set; }
        public int fsroot { get; set; }
        public double seqmax { get; set; }
        public double depmax { get; set; }
        public List<Phylagglomnode> t { get; set; } = new List<Phylagglomnode>();
        public abstract void premin(double[,] d, int[] nextp);
        public abstract double dminfn(double[,] d, int i, int j);
        public abstract double dbranchfn(double[,] d, int i, int j);
        public abstract double dnewfn(double[,] d, int k, int i, int j, int ni, int nj);
        public abstract void drootbranchfn(double[,] d, int i, int j, int ni, int nj, ref double bi, ref double bj);

        public Phylagglom(double[,] dist, int fsr = -1)
        {
            this.n = dist.GetLength(0);
            this.fsroot = fsr;
            this.t = new List<Phylagglomnode>(2 * n - 1);
        }

        public void makethetree(double[,] dist)
        {
            double[,] d = Globals.CopyFrom(dist);
            int[] tp = new int[n];
            int[] nextp = new int[n];
            int[] prevp = new int[n];
            int[] tasklist = new int[2 * n + 1];
            double[] tmp = new double[n];

            int j;
            int i = 0;
            for (; i < n; i++)
            {
                nextp[i] = i + 1;
                prevp[i] = i - 1;
                tp[i] = i;
                t[i].ldau = t[i].rdau = -1;
                t[i].nel = 1;
            }

            prevp[0] = nextp[n - 1] = -1;
            int ncurr = n;
            int imin = 0;
            int jmin = 0;
            int node = n;
            for (; node < 2 * n - 2; node++)
            {
                premin(d, nextp);
                double dmin = 9.99e99;
                for (i = 0; i >= 0; i = nextp[i])
                {
                    if (tp[i] == fsroot)
                    {
                        continue;
                    }
                    for (j = nextp[i]; j >= 0; j = nextp[j])
                    {
                        if (tp[j] == fsroot)
                        {
                            continue;
                        }
                        double dd = dminfn(d, i, j);
                        if ((dd) < dmin)
                        {
                            dmin = dd;
                            imin = i;
                            jmin = j;
                        }
                    }
                }

                i = imin;
                j = jmin;
                t[tp[i]].mo = t[tp[j]].mo = node;
                t[tp[i]].modist = dbranchfn(d, i, j);
                t[tp[j]].modist = dbranchfn(d, j, i);
                t[node].ldau = tp[i];
                t[node].rdau = tp[j];
                t[node].nel = t[tp[i]].nel + t[tp[j]].nel;
                for (int k = 0; k >= 0; k = nextp[k])
                {
                    tmp[k] = dnewfn(d, k, i, j, t[tp[i]].nel, t[tp[j]].nel);
                }
                for (int k = 0; k >= 0; k = nextp[k])
                {
                    d[i, k] = d[k, i] = tmp[k];
                }
                tp[i] = node;
                if (prevp[j] >= 0)
                {
                    nextp[prevp[j]] = nextp[j];
                }
                if (nextp[j] >= 0)
                {
                    prevp[nextp[j]] = prevp[j];
                }
                ncurr--;
            }

            i = 0;
            j = nextp[0];
            root = node;
            t[tp[i]].mo = t[tp[j]].mo = t[root].mo = root;

            //drootbranchfn(d, i, j, t[tp[i]].nel, t[tp[j]].nel, ref t[tp[i]].modist, ref t[tp[j]].modist);
            double tpim = t[tp[i]].modist;
            double tpjm = t[tp[j]].modist;
            drootbranchfn(d, i, j, t[tp[i]].nel, t[tp[j]].nel, ref tpim, ref tpjm);
            t[tp[i]].modist = tpim;
            t[tp[j]].modist = tpjm;

            t[root].ldau = tp[i];
            t[root].rdau = tp[j];
            t[root].modist = t[root].dep = 0.0;
            t[root].nel = t[tp[i]].nel + t[tp[j]].nel;
            int ntask = 0;
            seqmax = depmax = 0.0;
            tasklist[ntask++] = root;
            while (ntask > 0)
            {
                i = tasklist[--ntask];
                if (i >= 0)
                {
                    t[i].dep = t[t[i].mo].dep + t[i].modist;
                    if (t[i].dep > depmax)
                    {
                        depmax = t[i].dep;
                    }
                    if (t[i].ldau < 0)
                    {
                        t[i].seq = seqmax++;
                    }
                    else
                    {
                        tasklist[ntask++] = -i - 1;
                        tasklist[ntask++] = t[i].ldau;
                        tasklist[ntask++] = t[i].rdau;
                    }
                }
                else
                {
                    i = -i - 1;
                    t[i].seq = 0.5 * (t[t[i].ldau].seq + t[t[i].rdau].seq);
                }
            }
        }

        public int comancestor(int leafa, int leafb)
        {
            int i;
            int j;
            for (i = leafa; i != root; i = t[i].mo)
            {
                for (j = leafb; j != root; j = t[j].mo)
                {
                    if (i == j)
                    {
                        break;
                    }
                }
                if (i == j)
                {
                    break;
                }
            }
            return i;
        }

#if __UNUSED__
        private void newick(Phylagglom p, MatChar str, ref string filename)
        {
            FILE OUT = fopen(filename, "wb");
            int i;
            int s;
            int ntask = 0;
            int n = p.n;
            int root = p.root;
            int[] tasklist = new int[2 * n + 1];
            tasklist[ntask++] = (1 << 16) + root;
            while (ntask-- > 0)
            {
                s = tasklist[ntask] >> 16;
                i = tasklist[ntask] & 0xffff;
                if (s == 1 || s == 2)
                {
                    tasklist[ntask++] = ((s + 2) << 16) + p.t[i].mo;
                    if (p.t[i].ldau >= 0)
                    {
                        fprintf(OUT, "(");
                        tasklist[ntask++] = (2 << 16) + p.t[i].rdau;
                        tasklist[ntask++] = (1 << 16) + p.t[i].ldau;
                    }
                    else
                    {
                        fprintf(OUT, "%s:%f", str[i, 0], p.t[i].modist);
                    }
                }
                else if (s == 3)
                {
                    if (ntask > 0)
                    {
                        fprintf(OUT, ",\n");
                    }
                }
                else if (s == 4)
                {
                    if (i == root)
                    {
                        fprintf(OUT, ");\n");
                    }
                    else
                    {
                        fprintf(OUT, "):%f", p.t[i].modist);
                    }
                }
            }
            fclose(OUT);
        }

        private void phyl2ps(ref string filename, Phylagglom ph, MatChar str, int extend, double xl, double xr, double yt, double yb)
        {
            int i;
            int j;
            double id;
            double jd;
            double xi;
            double yi;
            double xj;
            double yj;
            double seqmax;
            double depmax;
            FILE OUT = fopen(filename, "wb");
            fprintf(OUT, "%%!PS\n/Courier findfont 8 scalefont setfont\n");
            seqmax = ph.seqmax;
            depmax = ph.depmax;
            for (i = 0; i < 2 * (ph.n) - 1; i++)
            {
                j = ph.t[i].mo;
                id = ph.t[i].dep;
                jd = ph.t[j].dep;
                xi = xl + (xr - xl) * id / depmax;
                yi = yt - (yt - yb) * (ph.t[i].seq + 0.5) / seqmax;
                xj = xl + (xr - xl) * jd / depmax;
                yj = yt - (yt - yb) * (ph.t[j].seq + 0.5) / seqmax;
                fprintf(OUT, "%f %f moveto %f %f lineto %f %f lineto 0 setgray stroke\n", xj, yj, xj, yi, xi, yi);
                if (extend != 0)
                {
                    if (i < ph.n)
                    {
                        fprintf(OUT, "%f %f moveto %f %f lineto 0.7 setgray stroke\n", xi, yi, xr, yi);
                        fprintf(OUT, "%f %f moveto (%s (%02d)) 0 setgray show\n", xr + 3.0, yi - 2.0, str[i, 0], i);
                    }
                }
                else
                {
                    if (i < ph.n)
                    {
                        fprintf(OUT, "%f %f moveto (%s (%02d)) 0 setgray show\n", xi + 3.0, yi - 2.0, str[i, 0], i);
                    }
                }
            }
            fprintf(OUT, "showpage\n\x0004");
            fclose(OUT);
        }
#endif
    }
}

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

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

相关文章

idea启动vue项目:Error:0308010C:digital envelope routines::unsupported

此问题是因为Node.js的版本原因&#xff0c;此处安装的Node.js是最新长期维护版: 18.16.0 (includes npm 9.5.1) 有两种解决办法&#xff1a; #1、方法一 重新安装低版本的node.js#2、方法二 在package.json文件中进行配置【此种方法较简单】介绍一下第二种方法&#xff1a; …

《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模&#xff0c;然而也存在需要后文预测前文的情况。 9.4.1 隐马尔可夫模型中的动态规划 数学推导太复杂了&#xff0c;略。 9.4.2 双向模型 双向循环神经网络&#xff08;bidirectional RNNs&#xff09;…

《向量数据库指南》——向量数据库是小题大作的方案?

假设大语言模型需要 10 秒钟才能生成一条结果,即需要存储的单条新记忆。那么我们获得 10 万条记忆的时间周期将为:100000 x 10 秒 = 1000000 秒——约等于 11.57 天。而即使我们用最简单的暴力算法(Numpy 的点查询),整个过程也只需要几秒钟时间,完全不值得进行优化!也就…

《Helm包管理工具篇:Helm工具概述和安装》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、Helm概述 Helm 是Kubernetes 的一个包管理工具&#xff0c;类似于Linux下的包管理工具如yum、apt等。可以方便的将之…

【试题025】C语言宏定义和表达式

题目&#xff1a; 若有宏定义: #define MOD(x,y) x%y 则执行以下语句后的输出结果是 ? int a13,b94: printf("%d\n",MOD(b,(a4)); 代码分析&#xff1a; #include <stdio.h> #define MOD(x,y) x%y //x和y两个形式参数进行模运算 int main() {/* 若有宏定义…

uniGUI 快速定制手机端输入界面布局

咱还是直奔主题&#xff0c;如何快速制作输入界面呢&#xff1f;如下图&#xff1a; 第一步&#xff0c;放置一个UnimFieldContainer&#xff0c;设置属性&#xff1a; AlignmentControluniAlignmentClient&#xff0c;让客户端处理对齐&#xff1b; LayoutConfig.Padding10,…

MySQL数据库——视图-介绍及基本语法(创建、查询、修改、删除、演示示例)

目录 介绍 语法 创建 查询 修改 删除 演示示例 介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff08;称为基表&#xff09;&#xff0c;并且是在使用视图时动…

优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符

&#x1f974;博主&#xff1a;小猫娃来啦 &#x1f974;文章核心&#xff1a;优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符 文章目录 引言空值处理的挑战解决方案1&#xff1a;?? 运算符基本用法与 || 运算符的区别实际应用场景举例 解决方案2&#xff…

fastadmin如何让后台的日期显示成年月日格式

fastadmin的后台时间戳字段如何显示成年月日的日期格式&#xff0c;网上有很多同仁也在问这个问题&#xff0c;下面我把我这摸索到的方法给大家分享一下&#xff1a; 解决方法&#xff1a; 找到public\asset\js\backend\控制器.js 增加formatter: Table.api.formatter.datetim…

基于stm32f103c8t6的串口中断蓝牙通讯

这一篇文章与 上一篇文章相基于 stm32f103c8t6的串口非中断蓝牙通讯上一篇文章相http://t.csdnimg.cn/7j0Ec 相比&#xff0c;硬件部分是相同的。在原有的旧初上&#xff0c;要在stm32cube加入中断&#xff0c;同时代码中也要引入中断函数以及中断回调函数。到后面我谁说说我…

免费的国产数据集成平台推荐

在如今的数字化时代下&#xff0c;企业内部的数据无疑是重要资产之一。随着数据源的多样性和数量剧增&#xff0c;如何有效地收集、整合、存储、管理和分析数据变得至关重要。为了解决这些常见痛点&#xff0c;数据集成平台成为了现代企业不可或缺的一部分。 数据集成是现代数…

腾讯云双11服务器优惠活动价格表预热!

2023腾讯云双十一优惠活动服务器特价多配置报价2核2G3M、2核2G4M、2核4G5M、2核4G5M、4核8G12M、8核16G18M和16核32G28M&#xff0c;目前腾讯云双11价格还没出来&#xff0c;阿腾云根据目前2核2G3M配置95元一年预测双11价格可能是88元一年&#xff0c;整理大概有个10%的优惠幅度…

原型设计工具:Balsamiq Wireframes 4.7.4 Crack

原型设计工具:Balsamiq Wireframes是一种快速的低保真UI 线框图工具&#xff0c;可重现在记事本或白板上绘制草图但使用计算机的体验。 它确实迫使您专注于结构和内容&#xff0c;避免在此过程后期对颜色和细节进行冗长的讨论。 线框速度很快&#xff1a;您将产生更多想法&am…

Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

在去年2022年曾发布一篇关于脚手架的文章&#xff1a;“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本&#xff0c;导致一些细节的实现存在不同。在本文中&#xff0c;将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…

uniGUI文件操作

一.文件上传TUniFileUploadButton TUniFileUploadButton主要属性&#xff1a; Filter: 文件类型过滤&#xff0c;有图片image/* audio/* video/*三种过滤 MaxAllowedSize: 设置文件最大上传尺寸&#xff1b; Message&#xff1a;标题以及消息文本&#xff0c;可翻译成中文…

手写call(),apply(),bind()方法

目录 知识储备&#xff1a; 一&#xff1a;手写call方法 1、思路 2、实现 3、Symbol调优 二&#xff1a;手写apply方法 1、思路 2、实现 三&#xff1a;手写bind方法 1、思路 2、实现 四&#xff1a;总结 知识储备&#xff1a; 所有的方法都可以调用我们手写的方法&…

npm ERR! node-sass@6.0.1 postinstall: `node scripts/build.js`

1.遇到的问题 vue npm install提示以下错误 2.首次尝试方法 尝试用下面的方式重新安装弄得-saas&#xff0c;结果不起作用 。 npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install node-sass 这时考虑降级node版本&#xff0c;node.js从…

上海亚商投顾:沪指再创年内新低 贵州茅台等权重股集体调整

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日全线调整&#xff0c;沪指逼近3000点大关&#xff0c;深成指、创业板指续创年内新低。芯片板块逆…

推荐系统(RS)

主流推荐算法 协同过滤算法 协同过滤算法的原理 根据用户群体对产品偏好的数据&#xff0c;发现用户之间的相似性或者物品之间的相似性&#xff0c;并基于这些相似性为用户作推荐。 基于用户的协同过滤算法&#xff08;User-based Collaborative Filtering&#xff09; 其本…

Leetcode刷题详解——四数之和

1. 题目链接&#xff1a;四数之和 2. 题目描述&#xff1a; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0…