从数组中找出和为sum的 一对数

本文介绍了一种高效算法来寻找数组中所有两个数的组合,这两个数的和等于给定的目标值。该算法利用了位操作和哈希表的思想,在大规模数据集上实现了快速查找,并详细展示了其实现过程。
从数组中,找出所有的,二数和为sum的数,不重复
-10 到 10 ,和为5的有 0,5 1,4 2,3 -1,6 -2,7 -3,8 -4,9 -5,10
    class Program
    {

        static void Main()
        {

            Console.WriteLine("create array integer");
            int[] arr = new int[100000000];//要计算的数组
            Random r = new Random();
            for (int i = 0; i < arr.Length; ++i)
            {
                arr[i] = r.Next(int.MinValue, int.MaxValue);//产生随机数
            }
            DateTime dt1 = DateTime.Now;
            Console.WriteLine("starttime: {0}", dt1);

            ArrayFind2.find(arr, 0);//查找

            DateTime dt2 = DateTime.Now;
            Console.WriteLine("endtime: {0}, totaltime: {1}.", dt2, dt2 - dt1);
            Console.Read();
        }
    }
    public class ArrayFind2
    {
        static long half = 2147483648L;
        static int len = (int)(2 * half / 8);
        static byte[] keys = new byte[] { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 };
        static byte[] others = new byte[] { 0x1 ^ 0xff, 0x2 ^ 0xff, 0x4 ^ 0xff, 0x8 ^ 0xff, 0x10 ^ 0xff, 0x20 ^ 0xff, 0x40 ^ 0xff, 0x80 ^ 0xff };

        public static void find(int[] arr, int sum)
        {
            Console.WriteLine("sf init    ");
            DateTime s = DateTime.Now;

            //512MB
            byte[] flag = new byte[len];
            //设置标记
            //如果按 ...flag[3],flag[2],flag[1],flag[0] 这样排列,0对应从右边数据,第half个位(bit)
            //int.MinValue 对应 右边第一位(bit),int.MaxValue对应左边第一位(bit)
            //bit上,1表示这数存在,0则不存在
            foreach (int k in arr)
            {
                //flag[(half + k) / 8] |= keys[(half + k) % 8];
                flag[(half + k) >> 3] |= keys[(half + k) & 0x7];
            }

            Console.WriteLine(string.Format("init end    {0}\nfind start ", (DateTime.Now - s)));
            s = DateTime.Now;

            foreach (int one in arr)
            {
                //先看i是否已计算过
                //加个条件,i!=sum-i,并且i存在(防有重复)
                if ((flag[(half + one) >> 3] & keys[(half + one) & 0x7]) != 0 && sum != 2 * one)
                {
                    //另一个娄
                    int other = sum - one;
                    //看另一个数是否存在
                    if ((flag[(half + other) >> 3] & keys[(half + other) & 0x7]) != 0)
                    {
                        //如果存在,将二个数设置为不存在
                        flag[(half + one) >> 3] &= others[(half + one) & 0x7];
                        flag[(half + other) >> 3] &= others[(half + other) & 0x7];
                        //Console.WriteLine(one + "," + other);//找出一对结果
                    }
                }
            }
            Console.WriteLine("find end    " + (DateTime.Now - s));
        }
    }

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值