首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【算法比赛】在一个整数数组中寻找符合A+B=C的组合,使C为最大。看谁的算法最快。 [已结贴,结贴人:zswang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    • 2

      7

    发表于:2008-05-22 11:27:08 楼主
    刚才在C/C++版看到这个算法问题。。。就搬到这里大家一起玩玩。。。

    说明在一个整数数组中寻找符合A+B=C的组合,使C为最大
    A、B、C为数组三个不同的元素
    数组的长度小于30000


    输入、输出范例输入:{ 1, 4, 2, 3 }
    输出:1+3=4

    输入:{ 2, 3, 1, 4, 5 }
    输出:2+3=5

    输入:{ 5, 8, 3, 1, 2, 4, 4 }
    输出:4+4=8

    输入:{ 4, 4, 5, 0, 1, 2, 3, 8, 9, 9, 100 }
    输出:0+9=9


    测试代码:
    C# code
    private void button1_Click(object sender, EventArgs e) { #region 初始化数组 int[] array = new int[arrayLength]; Random random = new Random(1000); // 固定随机种子,使大家测试数据一致 for (int i = 0; i < array.Length; i++) array[i] = random.Next(arrayLength * 10); #endregion 初始化数组 int A, B, C; long tickCount = Environment.TickCount; Search(array, out A, out B, out C); Console.WriteLine("计算结果:A={0} B={1} C={2},耗时:{3}", A, B, C, Environment.TickCount - tickCount); } public void Search(int[] array, out int A, out int B, out int C) { A = -1; B = -1; C = -1; /* TODO : 自由发挥 */ }


    最优算法奖励100分,其他酌情散掉。图
    该帖子于2008-05-24 00:32:49被版主修改
    400  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      7

    发表于:2008-05-22 11:29:141楼 得分:0
    这个忘记帖了。。。补上:
    C# code
    public const int arrayLength = 30000; // 数组的长度
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • amandag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      5

    发表于:2008-05-22 11:35:372楼 得分:1
    我是来收藏的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:37:033楼 得分:0
    下午试试!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • S170393163
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 11:46:194楼 得分:0
    看了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wxg22526451
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:06:105楼 得分:0
    顶下清洁工
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuwenge
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:08:146楼 得分:0
    得空的时候看看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gaoyipu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:21:287楼 得分:0
    关注中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • eagle_2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:25:488楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • h_w_king
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:31:299楼 得分:10
    C# code
    public void Search(int[] array, out int A, out int B, out int C) { A = -1; B = -1; C = -1; int[] all = new int[arrayLength * 10]; for (int i = 0; i < array.Length; i++) all[array[i]]++; for (int j = all.Length-1; j > 0; j--) { if (all[j] == 0) continue; int num = j; int halfnum=num/2; if (num % 2 == 0) { if (all[halfnum] >= 2) { A = B = halfnum; C = j; return; } } for (int t = 1; t < halfnum; t++) { if (all[t] > 0 && all[num - t] > 0) { A = t; B = num - t; C = num ; return; } } }



    抛砖引玉。
    代码还没仔细检查.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gomoku
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:31:3710楼 得分:5
    C# code
    static public void Search(int[] array, out int A, out int B, out int C) { A = -1; B = -1; C = -1; if( array == null || array.Length < 3) return; // O(n*log n) Array.Sort<int>(array); int maxNumber = array[ array.Length-1 ]; bool hasZero = (array[0] == 0); unsafe { byte* masks = stackalloc byte[maxNumber+2]; //if not Microsoft's CLR, DO initialize the allocated stack! //for (int i = 0; i < maxNumber + 2; i++) masks[i] = 0; for(int i=0; i<array.Length; i++) { masks[ array[i] ]++; } // O(n*n) for(int i=array.Length -1; i>=0; i--) { int sum = array[i]; // special case if( hasZero && masks[sum] > 1 ) { A = 0; B = sum; C = sum; return; } int halfSum = sum / 2; for(int j = i-1; j>0 && array[j] >= halfSum; j--) { if (masks[sum - array[j]] > 0) { A = sum - array[j]; B = array[j]; C = sum; if (A != B || masks[A] > 1) return; else { A = B = C = -1; } } } } } // done }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxl1102003
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:38:0011楼 得分:0
    关注中,只是实现比较容易,要是看速度的话....
    学习中....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      7

    发表于:2008-05-22 12:39:2212楼 得分:0
    C# code
    public void Search(int[] array, out int A, out int B, out int C) { Array.Sort(array); for (int i = array.Length - 1; i >= 2; i--) { C = array[i]; for (int j = i - 1; j >= 1; j--) { B = array[j]; A = C - array[j]; int k = Array.IndexOf(array, A, 0, j - 1); if (k >= 0) return; } } A = -1; B = -1; C = -1; }


    结果不知道对不对。。。
    输出计算结果:A=14 B=299984 C=299998,耗时:15
    计算结果:A=14 B=299984 C=299998,耗时:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      7

    发表于:2008-05-22 12:41:5713楼 得分:0
    测试数据太理想。。。。将测试代码改一下,让元素的范围再大点:
    C# code
    private void button1_Click(object sender, EventArgs e) { #region 初始化数组 int[] array = new int[arrayLength]; Random random = new Random(1000); // 固定随机种子,使大家测试数据一致 for (int i = 0; i < array.Length; i++) array[i] = random.Next(); // <<<<<<<<random.Next(arrayLength * 10); ->> random.Next(); #endregion 初始化数组 int A, B, C; long tickCount = Environment.TickCount; Search(array, out A, out B, out C); Console.WriteLine("计算结果:A={0} B={1} C={2},耗时:{3}", A, B, C, Environment.TickCount - tickCount); }


    这样好比较效率。。。
    输出计算结果:A=598172859 B=1549302681 C=2147475540,耗时:828

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Eleve
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:45:5614楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      7

    发表于:2008-05-22 12:46:3515楼 得分:0
    9楼的代码出现“其他信息: 索引超出了数组界限。”异常

    10楼的代码出现“未处理的“System.StackOverflowException”类型的异常出现在 WindowsApplication6.exe 中。”异常

    你俩商量好的吧。。。图
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      7

    发表于:2008-05-22 12:51:1516楼 得分:0
    9楼的代码:
    C# code
    int[] all = new int[arrayLength * 10];
    因为问题中并没有指明元素的范围,那A、B、C的范围就是int范围。
    不是0-arrayLength * 10那是只是用来测试用的。。。

    请用13楼的代码测试。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuanmanguo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:53:5617楼 得分:0
    up
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lujiaxing2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 12:54:2618楼 得分:0
    等回家再研究...
    现在的任务是卸载Visual Studio!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • grellen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:12:0019楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gomoku
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-22 13:15:4020楼 得分:5
    Hot fixes to my code in 10楼, for correctness in some very rare cases
    C# code
    static public void Search(int[] array, out int A, out int B, out int C) { A = -1; B = -1; C