Math 检查两个列表是否相似

Math 检查两个列表是否相似,math,data-structures,linked-list,Math,Data Structures,Linked List,在一次测试中,他们要求我们编写一个函数“int similor()” 检查两个列表的数据是否相似,而与它们的顺序无关。它们也可以有不同的大小(在这种情况下,它们是不同的) 就是,,。3->2->-1和-1>3>2是相似的 我为此编写了一个程序,如下所示。 也就是说,对于列表1,我添加所有元素并存储在sum1中。 我将所有元素相乘并存储在product1中。 同样,第二个列表中的sum2和product2。 如果它们的总和和乘积相等,那么它们必须包含相同的元素。 我的问题是这个算法完成了吗? 有没

在一次测试中,他们要求我们编写一个函数“int similor()” 检查两个列表的数据是否相似,而与它们的顺序无关。它们也可以有不同的大小(在这种情况下,它们是不同的) 就是,,。3->2->-1和-1>3>2是相似的 我为此编写了一个程序,如下所示。 也就是说,对于列表1,我添加所有元素并存储在sum1中。 我将所有元素相乘并存储在product1中。 同样,第二个列表中的sum2和product2。 如果它们的总和和乘积相等,那么它们必须包含相同的元素。 我的问题是这个算法完成了吗? 有没有我的逻辑失败的案例? 请帮帮我

 #include<stdio.h>
 struct _node_
 {
   int data;
   struct _node_ *ptr;
 };

 typedef struct _node_ Node;

struct _linkedlist_
 {
   Node *head;
   Node *tail;
   int count;
 };

 typedef struct _linkedlist_ List;

 int similar(List *, List *);

int main()
{

 //...code//

return 0;
}

int similar(List *one, List *two)
{
 int sum1=0;
 int sum2=0;
 int product1=1;
 int product2=1;
 int i;
 Node *temp;

 temp=one->head;
 for(i=0;i<one->count;i++)
{
 sum1=sum1+(temp->data);
 prodcut1=product1*(temp->data);
 temp=temp->ptr;
 }   

temp=two->head;
for(i=0;i<two->count;i++)
{
  sum2=sum2+(temp->data);
  prodcut2=product2*(temp->data);
  temp=temp->ptr;
 }  

if(sum1==sum2 && product1==product2)
  return 1;

 return0;
 }
#包括
结构节点_
{
int数据;
结构节点ptr;
};
typedef结构节点节点;
结构链接列表_
{
节点*头;
节点*尾部;
整数计数;
};
typedef结构链接列表;
int类似(列表*,列表*);
int main()
{
//…代码//
返回0;
}
int类似(列表*1,列表*2)
{
int sum1=0;
int-sum2=0;
int product1=1;
int-product2=1;
int i;
节点*温度;
温度=一个->头部;
对于(i=0;i计数;i++)
{
sum1=sum1+(温度->数据);
prodcut1=product1*(温度->数据);
温度=温度->ptr;
}   
温度=两个->头部;
对于(i=0;i计数;i++)
{
sum2=sum2+(温度->数据);
prodcut2=product2*(温度->数据);
温度=温度->ptr;
}  
if(sum1==sum2&&product1==product2)
返回1;
返回0;
}

根据数据相似性问题中提到的要求(即您仅检查数据顺序)

假设列表1中有元素
[-3,0,3]
,列表2中有元素
[10,-10,0]

在这种情况下,总和为0,乘积也为0

1. Sort both lists
2. Check every item of the list.
   2.1 if they are not equal
          -> print: lists are not equal.
3. lists are equal

注意:您可以对列表进行排序,也可以创建两个单独的列表,按排序顺序添加值

您的算法不完整,因为您的逻辑可能会失败。对于您的示例
3->2->-1
有另一个序列具有相同的和和和乘积,但不相似,即

1->(3+sqrt(33))/2->(3-sqrt(33))/2

(这些值四舍五入为
1
4.37228
-1.37228

您可以检查并查看这些值的总和是否为
4
,乘积是否为
-6
,就像原始列表一样


之所以会出现这种情况,是因为您只对值设置了两个要求,这意味着您只删除了两个自由度。如果列表中有三个或更多的值,则会留下一个或多个自由度,这允许无限多的可能性。我向您展示了一个示例,其中第一个值是
1
——可以为任何值
x
提供一个示例,其中
-0.971168