免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1712 | 回复: 7
打印 上一主题 下一主题

数值算法. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-22 13:28 |只看该作者 |倒序浏览
首先我不知道这样的一个算法问题,应当用什么方式来解决.

比如我有N组数据.

26,35,1203,5490....
25 34 1202,3442,5489,12324.....
......

1. 每组数据的个数,不相同. 但是它们按照由小到大的顺序排序.
2. 这些数据可能会有相似.比如26和25差1. 35和34差1.
3. 而且它们的位置未必会一一对应,比如 26可以对25, 35可以对34, 1203可以对1202.如果有百分之80以上的数据相差在0-1这样.就认为这两组数据是相似的.
4. 给出一组新的数据比如26,1203,5491.... 可以给出它和存在的某些数据是相似的.

这样的算法属于哪一类的算法?可以有什么好的办法?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2009-02-22 17:33 |只看该作者

  1. #include <stdlib.h>

  2. void skip_list(const int **a, int *alen, const int num)
  3. {
  4.         const int *pa;
  5.         int i;

  6.         pa = *a;
  7.         for (i = 0; i < *alen; i++) {
  8.                 if (pa[i] + 1 >= num) {
  9.                         break;
  10.                 }
  11.         }
  12.         *a = pa + i;
  13.         *alen -= i;
  14. }

  15. int compare_list(const int *a, int alen, const int *b, int blen)
  16. {
  17.         int count;

  18.         count = 0;
  19.         while (alen > 0 && blen > 0) {
  20.                 skip_list(&a, &alen, *b);
  21.                 if (abs(*a - *b) <= 1) {
  22.                         a++;
  23.                         alen--;
  24.                         b++;
  25.                         blen--;
  26.                         count += 2;
  27.                 }
  28.                 skip_list(&b, &blen, *a);
  29.                 if (abs(*a - *b) <= 1) {
  30.                         a++;
  31.                         alen--;
  32.                         b++;
  33.                         blen--;
  34.                         count += 2;
  35.                 }
  36.         }
  37.         return count;
  38. }

  39. /* TEST */

  40. #include <stdio.h>

  41. #define LEN(a) (sizeof(a)/sizeof((a)[0]))

  42. int main(void)
  43. {
  44.         static int a[] = {26,35,1105,1203,5490,12322};
  45.         static int b[] = {25,34,1202,3442,5489,12324};
  46.         int retval;

  47.         retval = compare_list(a, LEN(a), b, LEN(b));
  48.         if (retval * 100 / (LEN(a) + LEN(b)) >= 80) {
  49.                 printf("same: %d/%d\n", retval, LEN(a)+LEN(b));
  50.         }else {
  51.                 printf("not same: %d/%d\n", retval, LEN(a)+LEN(b));
  52.         }
  53.         return 0;
  54. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-02-22 18:34 |只看该作者
原帖由 cobras 于 2009-2-22 17:33 发表

#include

void skip_list(const int **a, int *alen, const int num)
{
        const int *pa;
        int i;

        pa = *a;
        for (i = 0; i < *alen; i++) {
                if (pa + 1 >= num) {
                        break;
                }
        }
        *a = ...


哥们首先感谢你辛苦的写了一些代码,但是我不需要代码,我需要的就是用什么样的算法来实现它.

另外你的代码不符合要求啊.我上面提供的那两组数据应该是属于相似的.

论坛徽章:
0
4 [报告]
发表于 2009-02-22 23:00 |只看该作者
如果把两个数a, b的“相等”定义为: |a - b| <= 1,那任意两组数据是否相似的问题就变成了它们的元素是否有80%以上的“相等”,亦即两个集合的交集的元素个数占各自的80%以上。如果写程序的话可以对一组数据中的元素使用binary_search(用自定义的相等运算),在另一组数据中查找是否有相同数据,然后统计个数就可以了。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2009-02-23 08:34 |只看该作者
原帖由 which 于 2009-2-22 18:34 发表


哥们首先感谢你辛苦的写了一些代码,但是我不需要代码,我需要的就是用什么样的算法来实现它.

另外你的代码不符合要求啊.我上面提供的那两组数据应该是属于相似的.

你再仔细看看测试数据,跟你的数据是不同的哦

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2009-02-23 08:36 |只看该作者
原帖由 bidongliang 于 2009-2-22 23:00 发表
如果把两个数a, b的“相等”定义为: |a - b|  

这应该是最简单的算法,但是时间复杂度会高一点。(是n * log2(n)吗?)

论坛徽章:
0
7 [报告]
发表于 2009-02-23 09:59 |只看该作者

回复 #1 which 的帖子

相似度计算?

不知道你的具体应用,你可以找找有关相似度计算方面的材料
重要的是,如何根据你的应用带定制你自己的相似度计算公式:)

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
8 [报告]
发表于 2009-02-23 11:03 |只看该作者
相似度是个模糊问题,只能用策略来进行初始化.譬如楼主举的例子里面的相似度策略就是同位差.数组A减数组B得到的新数组,如果波动在1范围之内的超过80%就符合策略条件.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP