我正在尝试计算项目与用户定义的偏好的匹配程度。以下是我想到的方法。但我并没有过多的经验,想知道是否有更好的方法可以解决这个问题。
使用汽车作为一个简单的例子。我们将其缩小到汽车的颜色和风格(汽车,面包车等)。
<小时/> 第一部分
用户在HTML表单中选择以下内容:
Color: ( )White, (*)Black, ( )Red
Style: ( )Car, ( )Van, (*)Suv, (*)Truck
现在,如果我将上述内容转换为第一个数字=第一个属性(白色)的二进制数字,并继续。
属性代码 = 0100011(黑色,suv,卡车)
<小时/> 第二部分
现在使用MySQL
Select item_id, attribute_code FROM items
items table = [item_id][attribute_code]
接下来,使用PHP计算每个项目属性代码与用户首选项的匹配程度。
// Set users attribute code to var
$user_pref = $_POST['user_att_code'];
while($row=mysql_fetch_array($result))
{
// Pull attribute_code from database and put into var
$item_code = $row['attribute_code'];
// Set counters
$count_digit = 0;
$count_match = 0;
// Length of attribute code
$length = 7;
// Start calculating match
while($count_digit <= $length)
{
// Does first digit of users code = 1?
// Does first digit of items code = 1?
if($user_pref{$count_digit} != 0 && $user_pref{$count_digit} == $item_code{$count_digit})
{
// Add a positive match point to counter
$count_match++;
}
// Next digit in code
$count_digit++;
}
if($count_match > 0)
{
// Make array of item_id and match amount
$item_search [$row['item_id']] = $count_match;
}
}
// Sort array by most similar
arsort($item_search);
然后使用更多代码来计算百分比。
以上做了以下内容:它使用了用户所需的属性代码,并将其与数据库中的每个项目属性代码进行了比较。它通过每个代码逐位进行,并在每次匹配时进行计数。最后,它将该项目的计数器放入一个数组中,然后转到下一个项目的属性代码。
user: 0100011
it_1: 0100011 = 100% match
it_2: 0100100 = 50% match
it_3: 0011000 = 0% match
// If you notice the 50% does not make sense ignore it.
// I left something out for simplification.
现在我知道这很有效。但是,这似乎不是一个好方法。 性能主要是聪明的。假设超过 150,000项,属性代码长度约为200 。对于一次搜索,这至少是30,000,000次计算(基于以上)。
还有另一种方式吗?这是一个大问题吗?
答案 0 :(得分:0)
为了获得更好的性能,您应该重新组织系统。
使用颜色和样式的分隔表。还有用于组织数据之间关系的表(项目 - 颜色,项目 - 样式)。
您将能够从用户选择的数据库ONLY参数中进行选择,而不是在每个请求中迭代所有项目。